Design patterns 为什么使用单例模式?

Design patterns 为什么使用单例模式?,design-patterns,static,singleton,Design Patterns,Static,Singleton,我是.NET开发者。我接受过几次采访,很多次我都遇到了一个问题:“单例设计模式的实际用途是什么?”。但我的问题是“为什么我们使用单例,静态关键字就足够了?”因为单例设计模式的目标是防止创建双实例。如果我将单个类标记为static,我也可以实现相同的目标。C语言中使类成为static的能力是singleton模式的语言实现 设计模式是解决常见问题的常用方法。在C++之类的语言中,类不能直接标记静态,必须通过一些智能结构来实现单元格-模式。在C语言中,这种功能是通过静态类内置的 问题/讨论的下一部分

我是.NET开发者。我接受过几次采访,很多次我都遇到了一个问题:“单例设计模式的实际用途是什么?”。但我的问题是“为什么我们使用单例,静态关键字就足够了?”因为单例设计模式的目标是防止创建双实例。如果我将单个类标记为static,我也可以实现相同的目标。

C语言中使类成为static的能力是singleton模式的语言实现

设计模式是解决常见问题的常用方法。在C++之类的语言中,类不能直接标记静态,必须通过一些智能结构来实现单元格-模式。在C语言中,这种功能是通过静态类内置的

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

编辑 阅读dave链接到的问题,我想补充一点:

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

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

考虑这一点:

public class MyFoo
{
  public static MyBar;
}
MyBar
是单身汉吗?它的特定实例是静态的,但类本身不是一个单例,因为它不会阻止您创建更多的实例。要实现singleton模式,您需要类本身来保证它可以有并且只有一个实例。更像这样:

public class Singleton
{
   private static Singleton instance;

   private Singleton() {}

   public static Singleton Instance
   {
      get 
      {
         if (instance == null)
         {
            instance = new Singleton();
         }
         return instance;
      }
   }
}
参考资料


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

这已经被问到(并得到了回答):工厂类和IoC容器w.r.t.单例模式用法的好例子