單例模式是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統中一個類只有一個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在一個,單例模式是最好的解決方案。
我們來看一下單例模式下的餓漢模式程式碼:
/// <summary> /// 餓漢模式 /// </summary> public class Singleton { //私有的構造器 private Singleton() { } //私有的靜態例項 private static Singleton instance = new Singleton(); public static Singleton GetInstance() { return instance; } }
懶漢模式程式碼:
/// <summary> /// 懶漢模式 /// </summary> public class Singleton2 { //私有的構造器 private Singleton2() { } //私有的靜態例項 private static Singleton2 instance = null; public static Singleton2 GetInstance() { if (instance==null) { instance=new Singleton2(); } return instance; } }
餓漢模式和懶漢模式的區別:
餓漢模式載入類時比較慢,但執行時獲取物件的速度比較快,執行緒安全的
懶漢模式載入類時比較快,但執行時獲取物件的速度比較慢,執行緒不安全的
C# 下的單例模式:
1、執行緒不安全:
//C# 下的單例模式(執行緒不安全) public class Singleton3 { public static readonly Singleton3 instance = new Singleton3(); private Singleton3() { } }
上面的實現完全可以達到單例模式的意圖,保證一個類僅且有一個例項,並提供一個全域性訪問點.而這在實際應用我們還得注意一點,就是在多執行緒的呼叫.於此,我們還得保證執行緒安全.要保證執行緒安全其實也是很簡單就可以實現的,只需要通過加鎖和雙重判斷就OK,下面是簡單的多執行緒的執行緒安全的實現:
2、執行緒安全:
//C# 下的單例模式(執行緒安全) public class Singleton4 { /// <summary> /// 宣告一個靜態鎖 /// </summary> private static object lockHelper = new object(); //私有建構函式 private Singleton4() { } //注意使用 volatile 關鍵字 private static volatile Singleton4 instance = null; //靜態屬性 public static Singleton4 Instance { get { if (instance == null) //雙檢查 { lock (lockHelper) { if (instance == null) { instance = new Singleton4(); } } } return instance; } } }