それぞれが一意の識別子を持つ一連のオブジェクトを作成することを目指しています。その識別子を持つオブジェクトが既に存在する場合は、既存のオブジェクトを使用したいと考えています。それ以外の場合は、新しいものを作成したいと思います。ここでは汚い言葉だとわかっているので、シングルトンという言葉を使用しないようにしています...
ファクトリメソッドを使用できます:
// A map of existing nodes, for getInstance.
private static Map<String, MyClass> directory = new HashMap<String, MyClass>();
public static MyClass getInstance(String name) {
MyClass node = directory.get(name);
if(node == null) {
node == new MyClass(name);
}
return node;
}
または、別の MyClassFactory メソッドを持つこともできます。
しかし、私は MyClass をサブクラス化するつもりでした:
public class MySubClass extends MyClass;
これ以上何もせず、MySubClass.getInstance() を呼び出すと:
MyClass subclassObj = MySubClass.getInstance("new name");
... その場合、subclassObj は MySubClass ではなく、プレーンな MyClass になります。
それでも、すべてのサブクラスで getInstance() をオーバーライドするのはハックに思えます。
私が見逃しているきちんとした解決策はありますか?
それが質問の一般化されたバージョンです。回答者がそれらを求めたので、より具体的に。
このプログラムは、ソフトウェアを表すノード間の依存関係の有向グラフを生成するためのものです。サブクラスには、Java プログラム、Web サービス、ストアド SQL プロシージャ、メッセージ駆動型トリガーなどが含まれます。
したがって、各クラスはこのネットワークの「要素」であり、他のノードとの依存関係をナビゲートおよび変更するためのメソッドがあります。サブクラス間の違いはpopulate()
、適切なソースからオブジェクトをセットアップするために使用されるメソッドの実装です。
「login.java」という名前のノードが、「checkpasswd.sqlpl」に依存していることを学習したとします。
this.addDependency( NodeFactory.getInstance("checkpasswd.sqlpl"));
問題は、この時点で checkpasswd.sqlpl オブジェクトが存在する場合と存在しない場合があることです。