我有需要由项目中的多个包共享的公共代码(我称之为控制器的多个类)。 我正在考虑创建一个返回这些控制器的工厂。 因此,工厂将有一个hashmap,可以返回请求的控制器,如果没有创建,则创建一个新的。 控制器有公共代码,因为我不需要创建这些控制器的多个实例,我认为它们应该是单例。
这看起来是一种好方法吗?
答案 0 :(得分:11)
我认为您需要的是Multiton pattern。
多重模式是一种类似于单身的设计模式, 只允许一个 要创建的类的实例。多重模式扩展了 单例概念将命名实例的映射作为键值进行管理 对。而不是每个应用程序有一个实例(例如 Java编程语言中的java.lang.Runtime对象) 相反,multiton模式确保每个键的单个实例。
public class FooMultiton {
private static final Map<Object, FooMultiton> instances = new HashMap<Object, FooMultiton>();
private FooMultiton() {
// no explicit implementation
}
public static synchronized FooMultiton getInstance(Object key) {
// Our "per key" singleton
FooMultiton instance = instances.get(key);
if (instance == null) {
// Lazily create instance
instance = new FooMultiton();
// Add it to map
instances.put(key, instance);
}
return instance;
}
// other fields and methods ...
}
控制器有公共代码,因为我不需要创建 这些控制器的多个实例,我认为应该是 单身。
您需要单个实例不一定意味着您需要 Singleton Pattern 。您可以拥有一个实例,并在后续调用时传递该实例。不一定使用private
构造函数强制执行单一性。
另请阅读Evil Singletons了解更多关于单身人士的不足之处。看完之后,如果你仍然觉得你需要单身人士,那就去吧。
答案 1 :(得分:1)
是的。 Singleton设计模式遇到了几个问题,其中之一就是Singletons无法扩展。
但是,如果通过ControllerFactory.createControllerX()而不是ControllerX.getInstace()检索这些控制器,您将来可以扩展ControllerX,并且其所有客户端都不会知道使用扩展版本。这是一件非常好的事情