【问题标题】:Why use Singleton Pattern?为什么使用单例模式?
【发布时间】:2011-10-16 12:50:47
【问题描述】:

我是 .NET 开发人员。我接受了几次采访,并且多次遇到一个问题,“单例设计模式在现实世界中的用途是什么?”。但我的问题是“为什么我们使用单例,静态关键字就足够了?”因为单例设计模式的目标是防止创建双重实例。如果我将我的 single_class 标记为静态,我也可以实现相同的目标。

【问题讨论】:

标签: design-patterns static singleton


【解决方案1】:

C# 中使类成为静态的能力是单例模式的语言实现。

设计模式是解决常见问题的常用方法。在诸如 C++ 之类的类不能直接标记为静态的语言中,必须通过一些智能构造(一种模式)来实现单例。在 C# 中,该功能是通过静态类内置的。

问题/讨论的下一部分是适合使用单例的地方,单例是一种全局对象/变量。我假设面试官想要讨论哪些地方合适,哪些地方不合适。

编辑

阅读Jon Skeet's answer 链接到的问题 dave 我想补充一点:

静态类不能实现接口,所以如果需要一个实现特定接口的单例,它必须是一个真实的对象,并且将类标记为static 是不行的。

【讨论】:

    【解决方案2】:

    C# 使用static 关键字来实现单例。但是,仅凭该关键字的优点并不能真正实现该模式。

    考虑一下:

    public class MyFoo
    {
      public static MyBar;
    }
    

    MyBar 是单身人士吗?它的特定实例是静态的,但类本身不是单例,因为它不会阻止您创建更多实例。要实现单例模式,您需要类本身来保证它只有一个实例。更像这样的东西:

    public class Singleton
    {
       private static Singleton instance;
    
       private Singleton() {}
    
       public static Singleton Instance
       {
          get 
          {
             if (instance == null)
             {
                instance = new Singleton();
             }
             return instance;
          }
       }
    }
    

    参考here

    使用此实现,应用程序无法创建此类的多个实例。这对于应用单例模式的事物非常有用,例如构建/跟踪其他类实例的工厂类。 (例如,一个 IoC 容器。)

    【讨论】:

    • 工厂类和 IOC Container w.r.t. 的好例子。单例模式用法
    猜你喜欢
    • 2011-10-23
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    相关资源
    最近更新 更多