參考 大話設計模式
定義:保證一個類別僅有一個實體,並提供一個存取它的全域訪問點。
使用時機:系統中某項資源只能有一個,使用這個設計,可以確保物件個體只有一個。
結構圖:來源
說明:定義一個 GetInstance 操作,允許客戶使用它的唯一實例。
多執行緒時的獨體
class Singleton { private static Singleton instance; //實體物件變數 private static readonly object syncRoot = new object(); //程式執行時建立一個靜態唯讀的行程輔助物件 /// <summary> /// 私有建構函式(不允許利用外部程式使用 new 來建立實體)。 /// </summary> private Singleton() { } /// <summary> /// 取得實體(靜態方法)。 /// </summary> public static Singleton GetInstance() { if (instance == null) { //判斷實體物件是否存在,不存在再加鎖處理 lock (syncRoot) { //為何不使用 lock(instance) 處理就好? //由於 instance 有沒有被建立過不明朗,所以使用 syncRoot 取代 if (instance == null) { //判斷兩次 instance == null 是因為,萬一一個執行緒已經建立了「實體」, //那當下一個執行緒進入時,就可以避免再建立新的實體 instance = new Singleton(); } } } return instance; } }
靜態初始化:
以上兩個範例都可以在多執行緒下執行,具有 thread safe。
其中, readonly 欄位則是可以在宣告或是在建構函式中初始化。
0 Comments:
張貼留言