【问题标题】:Creating a factory that returns singletons创建一个返回单例的工厂
【发布时间】:2013-12-09 12:58:52
【问题描述】:

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

这看起来是个好方法吗?

【问题讨论】:

  • 这听起来像是像 Spring 这样的 IOC 容器提供的开箱即用的功能。为什么要重新发明轮子?

标签: java design-patterns singleton factory


【解决方案1】:

我认为您需要的是Multiton pattern

多例模式是一种类似于单例的设计模式, 它只允许一个 要创建的类的实例。 multiton 模式在 将命名实例的映射作为键值来管理的单例概念 对。而不是每个应用程序只有一个实例(例如 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 ...
}

控制器有通用代码,因为我不需要创建 这些控制器的多个实例,我认为它们应该是 单身人士。

你需要单个实例不一定意味着你需要一个单例模式。您可以拥有一个实例并将其传递给后续调用。不一定要使用 private 构造函数强制单例。

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

【讨论】:

  • 这个模式和享元模式非常相似,但是在享元中你必须确保享元没有内部状态才能正确使用,和这里一样.. 另外不建议使用Object 作为哈希“键值集合”中的键。!
  • @nachokk 该程序不一定具有出色的性能;)只是为了表达想法。顺便说一句,它来自维基百科。但这是一个很好的观点。
  • 不是为了性能,“所有基于哈希的集合都假定对象的哈希值在用作集合中的键时不会改变。如果键的哈希码在它被改变时在一个集合中,可能会出现一些不可预测和令人困惑的后果”。
【解决方案2】:

是的。 Singleton 设计模式存在几个问题,其中之一是 Singleton 无法扩展。

但是,如果您通过 ControllerFactory.createControllerX() 而不是 ControllerX.getInstace() 来检索这些控制器,您将能够在未来扩展 ControllerX,并且它的所有客户端都不会知道使用扩展版本。这是一件非常好的事情

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多