Я стремлюсь создать набор объектов, каждый из которых имеет уникальный идентификатор. Если объект с таким идентификатором уже существует, я хочу использовать существующий объект. В противном случае я хочу создать новый. Я стараюсь не использовать слово Синглтон, потому что знаю, что это ругательное слово...
Я могу использовать фабричный метод:
// 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 будет простым MyClass, а не MySubClass.
Тем не менее переопределение getInstance() в каждом подклассе кажется хакерским.
Есть ли изящное решение, которое мне не хватает?
Это обобщенная версия вопроса. Больше конкретики, раз уж ответчики просили о них.
Программа предназначена для построения ориентированного графа зависимостей между узлами, представляющими части программного обеспечения. Подклассы включают программы Java, веб-службы, хранимые процедуры SQL, триггеры, управляемые сообщениями, и т. д.
Таким образом, каждый класс «является» элементом в этой сети и имеет методы для навигации и изменения отношений зависимости с другими узлами. Различие между подклассами будет заключаться в реализации метода populate()
, используемого для настройки объекта из соответствующего источника.
Допустим, узел с именем «login.java» узнает, что он зависит от «checkpasswd.sqlpl»:
this.addDependency( NodeFactory.getInstance("checkpasswd.sqlpl"));
Проблема в том, что объект checkpasswd.sqlpl может уже существовать, а может и не существовать в это время.
getInstance()
отсутствуетreturn
. - person Ken Gentle   schedule 25.11.2008