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

12r*_*rad 5 java singleton design-patterns factory

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

这看起来像是一个好方法吗?

Nar*_*hai 11

我认为你需要的是Multiton模式.

multiton模式是一种类似于singleton的设计模式,它只允许创建一个类的一个实例.多元模式扩展了单例概念,以将命名实例的映射作为键值对进行管理.而不是每个应用程序有一个实例(例如Java编程语言中的java.lang.Runtime对象),而是确保每个键的单个实例.

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 ...
}
Run Code Online (Sandbox Code Playgroud)

控制器有公共代码,因为我不需要创建这些控制器的多个实例,我认为它们应该是单例.

您需要单个实例并不一定意味着您需要Singleton模式.您可以拥有一个实例,并在后续调用时传递该实例.不一定使用private构造函数强制执行单一性.

另请阅读Evil Singletons,了解更多关于单身人士的不足之处.看完之后,如果你仍然觉得你需要Singleton,那就去吧.