Singleton 單例模式簡介與 C# 範例【建立型】【設計模式來了】

2023-05-25 21:00:29

 〇、簡介

1、什麼是單例模式?

一句話解釋:

  單一的類,只能自己來建立唯一的一個物件。

單例模式(Singleton Pattern)是日常開發中最簡單的設計模式之一。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。

這種模式涉及到一個單一的類,該類負責建立自己的物件,同時確保只有一個物件被建立。這個類提供了一種存取其唯一的物件的方式,可以直接存取,不需要範例化該類的物件

 一個比喻:(班主任與學生)

  比如一個班級,只有一個班主任,任何一個同學要找班主任,都是找的同一個,班主任忙的時候,當然就出現排隊的情況。

2、優缺點和使用場景

  • 優點:記憶體裡只有一個範例,減少了記憶體的開銷,也避免了物件高頻建立帶來的效能損耗。
  • 缺點:任務量大時,會出現排隊,耗時增加。另外與單一職責原則衝突,一個類應該只關心內部邏輯,而不關心外面怎麼樣來範例化。

 使用場景舉例:

  • 要求生產唯一序列號。
  • WEB 中的計數器,不用每次重新整理都在資料庫里加一次,用單例先快取起來。
  • 建立的一個物件需要消耗的資源過多,比如 I/O 與資料庫的連線等。

一、單例模式簡單實現

public class Singleton
{
    private static Singleton instance = null;
    private static object lockObject = new object();
    /// <summary>
    /// 私有化建構函式,防止外部範例化
    /// </summary>
    private Singleton() { }
    public static Singleton Instance
    {
        get
        {
            if (instance == null)
            {
                lock (lockObject) // 執行緒同步鎖
                {
                    if (instance == null) // Lazy Initialization
                    {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }
    /// <summary>
    /// 重置 Singleton
    /// </summary>
    public void Reset()
    {
        instance = null;
    }
}

 測試程式碼:

static void Main(string[] args)
{
    var instance1 = Singleton.Instance;
    var instance2 = Singleton.Instance;
    Console.WriteLine(instance1 == instance2); // 輸出 true 
}

二、帶引數的單例模式實現

public class SingletonParameters
{
    private static SingletonParameters instance = null;
    private static object lockObject = new object();
    private int _firstvalue, _secondvalue;
    /// <summary>
    /// 私有化建構函式,防止外部範例化
    /// </summary>
    private SingletonParameters(int first, int second)
    {
        this._firstvalue = first;
        this._secondvalue = second;
    }
    public static SingletonParameters InstanceParameters(int first, int second)
    {
        if (instance == null)
        {
            lock (lockObject) // 執行緒同步鎖
            {
                if (instance == null) // Lazy Initialization
                {
                    instance = new SingletonParameters(first, second);
                }
            }
        }
        else
        {
            instance.FirstValue = first;
            instance.SecondValue = second;
        }
        return instance;
    }
    public int FirstValue { get { return _firstvalue; } set { _firstvalue = value; } }
    public int SecondValue { get { return _secondvalue; } set { _secondvalue = value; } }
    /// <summary>
    /// 重置 Singleton
    /// </summary>
    public void Reset()
    {
        instance = null;
    }
}

 測試程式碼:

var instance1 = SingletonParameters.InstanceParameters(1, 2);
Console.WriteLine($"FirstValue:{instance1.FirstValue}");
Console.WriteLine($"SecondValue:{instance1.SecondValue}");
var instance2 = SingletonParameters.InstanceParameters(3, 4);
Console.WriteLine($"FirstValue:{instance2.FirstValue}");
Console.WriteLine($"SecondValue:{instance2.SecondValue}");
Console.WriteLine($"instance1 == instance2 : {instance1 == instance2}");

 

參考:https://www.cnblogs.com/gaochundong/p/design_pattern_singleton.html