Singleton类的多个实例。可能?

时间:2014-11-27 05:41:08

标签: design-patterns language-agnostic singleton

我找到了this解释性链接,其中说明了

  

确保一个类有一个实例,并提供全局访问点   它。

我最近出现在一次采访中,令我惊讶的是,too向我询问可以使单例类具有多个实例,我的技术是Java和Objective C.我对此的回答问题是,我认为这是正确的,因为Singleton变量是全局的,应检查它是否为null。它将是第一次null 但出于好奇,我确认了这一点。有人可以提供解释天气的确认我是对还是错。

6 个答案:

答案 0 :(得分:8)

根据定义(设计模式)单词Singleton不允许多个实例,但是你可以通过调整类来创建多个实例,但是根据定义它不会被视为Singleton

答案 1 :(得分:3)

设计良好的单例每个应用程序只能有一个实例。 创建多个实例是应用程序设计中的一个错误。在某些情况下可能会发生,例如:

  • 具有延迟初始化的非线程安全单例:几个线程正在尝试获取实例并创建多个实例。懒惰单身人士的良好做法是init on demand
  • 当使用DI容器来管理单例(例如Spring)和几个上下文时,每个上下文都会创建自己的类实例。

答案 2 :(得分:3)

  

单例类可以有多个实例吗?

     

答案:否

这是java中Singleton类的简单示例。通过调用Singleton.getInstance(),您可以获得此Singleton类的实例。这里的实例是private static,构造函数是private,因此每个JVM只有一个对象可用。

 public class Singleton {    

        private static Singleton instance = new Singleton ();

        private Singleton () {
        }

        public static Singleton getInstance() {
            return instance;
        }
    }

创建单例的懒惰实例化也称为经典单例并且它不是线程安全版本

public class Singleton {    

            private static Singleton instance = null;

            private Singleton () {
            }

            public static Singleton getInstance() {
                if(instance==null){
                   instance=new Singleton();
                }
                return instance;
            }
        }

线程安全的延迟初始化单例类可以通过以下简单方式实现

public class Singleton {
    private Singleton() {}

    private static class LazyHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return LazyHolder.INSTANCE;
    }
}

答案 3 :(得分:2)

我正在为Architect认证做设计,这个问题浮出水面。

我相信当您访问源代码时,最好得到回答,我认为这是Erich Gamma / Richard Helm / Ralph Johnson / John Vlissides撰写的书[设计模式:可重用的面向对象软件的元素]。我进行了快速研究,并没有在本书发行之初就找到这个定义。

尽管在开始时(第127页)指出,其目的是“确保一个类只有一个实例,并提供对它的全局访问点。”,在“后果”部分,项目符号4,的变体为“允许可变数量的实例。该模式可以轻松地改变主意,并允许多个Singleton类实例。此外,您可以使用相同的方法来控制实例数量, 应用程序使用。仅授予访问Singleton权限的操作 实例需要更改。”

话虽如此,我相信正式的答案是单例CAN可以有多个实例,尽管我特别不认为这在现实世界中会得到应用(顺便说一句,在您的采访中将其置入的人似乎都没有对评估您的有用技能非常感兴趣)。

答案 4 :(得分:1)

我知道这是一个旧的,但我希望我能帮助别人。

可悲的是,Singleton模式有很多定义。实例

Definition 1 HTDIN

  

Singleton模式是应用程序想要的设计解决方案   在所有可能的场景中,都有一个且只有一个类的实例   没有任何特殊情况。

Definition 2 Wikipedia:

  

在软件工程中,单例模式是一种软件设计   将类的实例化限制为一个对象的模式。   当只需要一个对象来协调操作时,这很有用   整个系统。这个概念有时会推广到系统   只有一个物体存在时,运行效率更高,或那个   将实例化限制为一定数量的对象。术语   来自单身人士的数学概念。

第一个更严格,但是如果你看第二个描述就说明可能有多个实例。这样您就可以执行pooling之类的操作。

{{1}}

根据第一个定义,这不是单身,但第二个允许。我正在阅读OCM Java EE 6 Enterprise Architect Exam Guide它同意维基百科的定义。

答案 5 :(得分:1)

这是一个很好的理论问题,但是定义非常清楚地说明了“确保一个类仅具有一个实例”模式。您可以构建几乎相同的模式,该模式可以实例化最多4个相同类型的对象。

在这种情况下,模式的定义必须是“确保一个类仅包含有限数量的实例”。

您可以从另一个角度看问题。您将必须将这4个对象保存在数据结构中。既可以作为硬编码的单独成员(实例1,实例2,...),也可以作为列表中的成员。在第二种情况下,该列表可以视为单例。