參考 大話設計模式
定義:保證一個類別僅有一個實體,並提供一個存取它的全域訪問點。
使用時機:系統中某項資源只能有一個,使用這個設計,可以確保物件個體只有一個。
結構圖:來源
說明:定義一個 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:
張貼留言