一.介紹
單例模式(Singleton Pattern)。屬於創建型模式。它保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。
二.實現
結構為,一個私有的靜態變量,用於存放該實例。私有的構造函數,防止外部直接創建該類實例。
創建單例模式有兩種方式。餓漢式和懶漢式。
餓漢式是直接在程序中初始化一個對象實例。
//餓漢式 public class Singleton { /// <summary> /// 私有的靜態變量,直接初始化 /// </summary> private static Singleton Instance = new Singleton(); /// <summary> /// 私有的構造函數 /// </summary> private Singleton() { } /// <summary> /// 獲取靜態實例的靜態方法 /// </summary> /// <returns></returns> public static Singleton GetInstance() { return Instance; } }
上面餓漢式創建的單例模式有一個缺點,就是程序不使用也會創建一個實例,這樣會占內存。而使用懶漢式創建的單例模式,是需要使用的時候,才去創建實例。
//懶漢式 public class Singleton2 { /// <summary> /// 私有的靜態變量 /// </summary> private static Singleton2 Instance = null; /// <summary> /// 私有的構造函數 /// </summary> private Singleton2() { } /// <summary> /// 獲取靜態實例的靜態方法 /// </summary> /// <returns></returns> public static Singleton2 GetInstance() { if (Instance == null) { Instance = new Singleton2(); } return Instance; } }
上面兩種創建單例模式的方法在單線程使用的時候沒有問題,餓漢式創建的實例在多線程中也沒有問題,懶漢式創建的實例在多線程中就會出現問題。我們可以通過lock關鍵字在多線程中保證單例。
//單例模式 雙重檢查 public class Singleton3 { /// <summary> /// 私有的靜態變量 /// </summary> private static Singleton3 Instance = null; private static object locker = new object(); /// <summary> /// 私有的構造函數 /// </summary> private Singleton3() { } /// <summary> /// 獲取靜態實例的靜態方法 /// </summary> /// <returns></returns> public static Singleton3 GetInstance() { //先檢查Instance是否為null,防止每次調用都鎖定locker,影響性能 if (Instance == null) { //使用lock lock (locker) { if(Instance == null) { Instance = new Singleton3(); } } } return Instance; } }
參考 https://www.cnblogs.com/restartyang/articles/7770856.html