sli*_*lim 11 java polymorphism design-patterns factory
我的目标是创建一组对象,每个对象都有一个唯一的标识符.如果已存在具有该标识符的对象,我想使用现有对象.否则我想创建一个新的.我试图不使用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;
}
Run Code Online (Sandbox Code Playgroud)
或者同样,我可以有一个单独的MyClassFactory方法.
但我原本打算将MyClass子类化:
public class MySubClass extends MyClass;
Run Code Online (Sandbox Code Playgroud)
如果我不再做,并调用MySubClass.getInstance():
MyClass subclassObj = MySubClass.getInstance("new name");
Run Code Online (Sandbox Code Playgroud)
...然后subclassObj将是一个普通的MyClass,而不是MySubClass.
然而,在每个子类中重写getInstance()似乎很容易.
我缺少一个简洁的解决方案吗?
这是问题的通用版本.更具体,因为回答者要求他们.
该程序用于生成表示软件片段的节点之间的依赖关系的有向图.子类包括Java程序,Web服务,存储的SQL过程,消息驱动的触发器等.
因此,该网络中的每个类都是"is-a"元素,并且具有导航和修改与其他节点的依赖关系的方法.子类之间的区别在于populate()
用于从适当的源设置对象的方法的实现.
假设名为'login.java'的节点知道它对'checkpasswd.sqlpl'有依赖性:
this.addDependency( NodeFactory.getInstance("checkpasswd.sqlpl"));
Run Code Online (Sandbox Code Playgroud)
问题是checkpasswd.sqlpl对象此时可能已存在,也可能尚未存在.
静态方法是在父类上定义的,并且也是静态调用的。因此,无法知道您在子类上调用了该方法。java 编译器甚至可能静态地将调用解析为对父类的调用。
因此,您需要按照您的建议在子类中重新实现静态方法,或者使它们不是静态的,以便您可以继承(在工厂对象的层次结构上,而不是类上),或者传递一个参数来表示您想要的类型创造。
查看 EnumSet.noneOf() 方法。它有与您类似的问题,它通过传递 java.lang.Class 方法来解决它。您可以在该类上使用 newInstance 。但就我个人而言,我只使用工厂对象而不是具有静态方法的类。
归档时间: |
|
查看次数: |
15827 次 |
最近记录: |