設計模式之單利模式(C#語言描述,附視訊下載地址)
阿新 • • 發佈:2018-12-10
今天來介紹所有設計模式中結構最簡單的設計模式單例模式,它的核心結構中只包含一個被稱為單例類的特殊類。
要想完成單例類的設計,我們要遵循一下原則即可:
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; } }
視訊學習下載地址:單例模式