單例模式

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