Я стремлюсь создать набор объектов, каждый из которых имеет уникальный идентификатор. Если объект с таким идентификатором уже существует, я хочу использовать существующий объект. В противном случае я хочу создать новый. Я пытаюсь не использовать слово Singleton, потому что я знаю, что это грязное слово здесь ...
Я могу использовать фабричный метод:
// 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, управляемые сообщениями триггеры и т. Д.
Таким образом, каждый класс "is-a" является элементом в этой сети и имеет методы для навигации и изменения отношений зависимости с другими узлами. Разница между подклассами будет заключаться в реализации метода populate()
, используемого для настройки объекта из соответствующего источника.
Допустим, узел с именем 'login.java' узнает, что у него есть зависимость от 'checkpasswd.sqlpl':
this.addDependency( NodeFactory.getInstance("checkpasswd.sqlpl"));
Проблема в том, что объект checkpasswd.sqlpl может существовать или не существовать в настоящее время.