Polymorphic factory / getInstance () en Java

Je vise à créer un ensemble d'objets, dont chacun a un identifiant unique. Si un objet existe déjà avec cet identifiant, je veux utiliser l'objet existant. Sinon je veux en créer un nouveau. J'essaie de ne pas utiliser le mot Singleton, parce que je sais que c'est un gros mot ici...

Je peux utiliser une méthode de fabrique:

    //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;
}

Tout, je pouvais avoir une MyClassFactory méthode.

Mais je n'avais prévu à la sous-classe MyClass:

public class MySubClass extends MyClass;

Si je ne fais pas de plus, et d'invoquer MySubClass.getInstance():

MyClass subclassObj = MySubClass.getInstance("new name");

... puis subclassObj sera une plaine MyClass, pas un MySubClass.

Pourtant primordial getInstance() dans chaque sous-classe semble hacky.

Est-il une solution élégante, je suis absent?


C'est la version généralisée de la question. Plus de détails, depuis la answerers a demandé pour eux.

Le programme est pour la génération d'un graphe orienté de dépendances entre les nœuds représentant des morceaux de logiciel. Les sous-classes comprennent des programmes Java, Services Web, Stockées SQL procédures, message-driven triggers, etc.

De sorte que chaque classe "est-un" élément de ce réseau, et possède des méthodes permettant de naviguer et de modifier les relations de dépendance avec les autres nœuds. La différence entre les sous-classes sera la mise en œuvre de la populate() méthode utilisée pour définir l'objet à partir de la source appropriée.

Disons que le nœud nommé 'login.java" apprend qu'il a une dépendance sur " checkpasswd.sqlpl':

this.addDependency( NodeFactory.getInstance("checkpasswd.sqlpl"));

Le problème est que le checkpasswd.sqlpl objet peut ou non existent déjà à ce moment.

source d'informationauteur slim