单例模式

Singleton 模式旨在将类的创建限制为一个实例。

这种模式用于只有一个东西才有意义的场景,例如:

  • 一个编排其他对象交互的单一类,例如。经理类
  • 或者一个代表唯一的单一资源的类,例如记录组件

实现 Singleton 模式的最常见方法之一是通过静态**工厂方法,**例如 CreateInstance()GetInstance()(或 C#中的静态属性,Instance),然后将其设计为始终返回相同的实例。

对方法或属性的第一次调用创建并返回 Singleton 实例。此后,该方法始终返回相同的实例。这样,只有一个单例对象的实例。

防止通过 new 创建实例可以通过使类构造函数 private. 来实现

以下是在 C#中实现 Singleton 模式的典型代码示例:

class Singleton
{
    // Because the _instance member is made private, the only way to get the single 
    // instance is via the static Instance property below. This can also be similarly 
    // achieved with a GetInstance() method instead of the property.
    private static Singleton _instance = null;

    // Making the constructor private prevents other instances from being 
    // created via something like Singleton s = new Singleton(), protecting
    // against unintentional misuse.
    private Singleton()
    {
    }

    public static Singleton Instance
    {
        get 
        {
            // The first call will create the one and only instance.
            if (_instance == null)
            {
                _instance = new Singleton();
            }

            // Every call afterwards will return the single instance created above.
            return _instance;
        }
    }
}

为了进一步说明这种模式,下面的代码检查在多次调用 Instance 属性时是否返回相同的 Singleton 实例。

class Program
{
    static void Main(string[] args)
    {
        Singleton s1 = Singleton.Instance;
        Singleton s2 = Singleton.Instance;
        
        // Both Singleton objects above should now reference the same Singleton instance.
        if (Object.ReferenceEquals(s1, s2))
        {
            Console.WriteLine("Singleton is working");
        }
        else
        {
            // Otherwise, the Singleton Instance property is returning something 
            // other than the unique, single instance when called.
            Console.WriteLine("Singleton is broken");
        }
    }
}

注意:此实现不是线程安全的。

要查看更多示例,包括如何使此线程安全,请访问: Singleton Implementation

单例在概念上类似于全局价值,并导致类似的设计缺陷和担忧。因此,Singleton 模式被广泛认为是反模式。

访问 “单例有什么坏处?” 有关使用它们时出现的问题的更多信息。

在 C#中,你可以创建一个类 static,它使所有成员都是静态的,并且无法实例化该类。鉴于此,通常会看到使用静态类代替 Singleton 模式。

有关两者之间的主要区别,请访问 C#Singleton Pattern 与 Static Class