1. 程式人生 > >設計模式之單利模式(C#語言描述,附視訊下載地址)

設計模式之單利模式(C#語言描述,附視訊下載地址)

今天來介紹所有設計模式中結構最簡單的設計模式單例模式,它的核心結構中只包含一個被稱為單例類的特殊類。

要想完成單例類的設計,我們要遵循一下原則即可:

1、一個類只能有一個例項

2、確保該例項對外有一個訪問入口(保證我們的系統可以從這個入口拿到該類的唯一例項)

3、將單例類的建構函式私有化(private),當建構函式被私有化之後,外部無法通過new 單例類()的方法來例項化該類。既然外部無法直接例項化該類,那就要求該類的例項要自己去建立了~

下面我們先看一個最簡單的單例類的實現:

    /// <summary>
    /// 單例類
    /// </summary>
    public class Singleton
    {
        private Singleton instance = null;
        //建構函式私有化
        private Singleton()
        {
 
        }
        //外部通過該類的唯一入口(GetInstance方法)獲得單例類的例項
        public Singleton GetInstance()
        {
            if (instance == null)
                instance = new Singleton();
            return instance;
        }
    }

  其實上面的程式碼只是簡單的介紹單例類的寫法,下面我們來介紹一下餓漢式單例和懶漢式單例。

    /// <summary>
    /// 餓漢式單例類
    /// </summary>
    public class Singleton
    {
        private static Singleton instance = new Singleton();
        //建構函式私有化
        private Singleton()
        {
 
        }
        //外部通過該類的唯一入口(GetInstance方法)獲得單例類的例項
        public Singleton GetInstance()
        {
            return instance;
        }
    }

餓漢式單例類在類初始化的時候,直接new了一個單例類的例項並賦值給靜態私有變數,因為靜態變數歸類所有,所以程式自始至終只會有一個例項。

二、懶漢式單例類

上面的程式碼看上去很完美,並沒有什麼問題。但是大家可以想一個問題,在高併發大流量的情況下,如果多個應用程式對該類進行例項化時(併發呼叫GetInstance方法時),有可能會導致單例類建立多個例項。所以,為了解決併發建立多個例項的問題,我們可以對例項的建立過程加鎖。這就衍生出來了懶漢式單例類。

    /// <summary>
    /// 懶漢式單例類(高併發處理)
    /// </summary>
    public class Singleton
    {
        private static Singleton instance = null;
        private static readonly object syncRoot = new object();
        //建構函式私有化
        private Singleton()
        {
 
        }
        //外部通過該類的唯一入口(GetInstance方法)獲得單例類的例項
        public static Singleton GetInstance()
        {
            if (instance == null)
            {
                lock (syncRoot)//加鎖之後只允許單執行緒訪問,但是此處可能有其他的並發現成在此處等待執行
                {
                    //因為鎖外面有可能併發執行緒在等待執行,為了防止執行緒例項化類之後,後面的執行緒繼續例項化物件,應該在加一層判斷
                    if (instance == null)
                    {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }

  視訊學習下載地址:單例模式