创建一个返回单身人士的工厂

时间:2013-12-09 12:58:53

标签: java design-patterns singleton factory

我有需要由项目中的多个包共享的公共代码(我称之为控制器的多个类)。 我正在考虑创建一个返回这些控制器的工厂。 因此,工厂将有一个hashmap,可以返回请求的控制器,如果没有创建,则创建一个新的。 控制器有公共代码,因为我不需要创建这些控制器的多个实例,我认为它们应该是单例。

这看起来是一种好方法吗?

2 个答案:

答案 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,并且其所有客户端都不会知道使用扩展版本。这是一件非常好的事情