1. 程式人生 > 遊戲資訊 >方舟自創生物:鱗蝦(群)

方舟自創生物:鱗蝦(群)

單例模式是用來保證程序中,某個類只有一個例項。因為有時候某個類很佔用資源,例如:資料庫連線、或者是類在構造的時候很耗費資源和時間。

單例模式的實現分為兩種:餓漢式和懶漢式。前者是在靜態建構函式執行時就立即例項化,後者是在程式執行過程中第一次需要時再例項化。

懶漢式

/// <summary>
    /// 懶漢式
    /// </summary>
    public class Singleton
    {

        private Singleton() //私有化建構函式,避免外部建立
        {
            long lResult = 0;
            for (int i = 0; i < 1000000; i++)
            {
                lResult += i;
            }
            Thread.Sleep(2000);
            Console.WriteLine($"{this.GetType().Name}被構造一次!");
        }

        /// <summary>
        /// 靜態變數 (定義成靜態變數,保障全域性唯一)
        /// </summary>
        private static volatile Singleton _singleton = null; //volatile 促進執行緒安全
        private static object sinletonLock = new object(); 


        /// <summary>
        /// 公開的靜態方法提供物件例項
        /// </summary>
        /// <returns></returns>
        public static Singleton CreateInstance()
        {
            //解決多執行緒呼叫時執行緒不在進行加鎖然後進行判斷。
            if (_singleton == null)
            {
                lock (sinletonLock)
                {
                    //保證只被例項化一次
                    if (_singleton == null)
                    {
                        _singleton = new Singleton();
                    }
                }
            }
            
            return _singleton;
        }

    }

  

懶漢式單例主要包括三部分:
1.私有化建構函式,避免外部建立。
2.公開的靜態方法提供物件例項。
3. 靜態變數 (定義成靜態變數,保障全域性唯一)。

餓漢式

public class Singleton
{
    private static readonly Singleton _instance;
    static Singleton()
    {
        _instance = new Singleton();
    }

    public static Singleton Instance
    {
        get
        {
            return _instance;
        }
    }
}

  

餓漢式是在靜態建構函式中立即進行例項化。注意,為了確保單例性,需要使用 readonly 關鍵字宣告例項不能被修改。
以上寫法可簡寫為:

public class Singleton
{
    private static readonly Singleton _instance = new Singleton();
    public static Singleton Instance
    {
        get
        {
            return _instance;
        }
    }
}

  

在 C# 7 中還可以進一步簡寫,一句程式碼就搞定了,此寫法如下:

public class Singleton
{
    public static Singleton Instance { get; } = new Singleton();
}