2011/04/25

[Design Patterns] 獨體模式(Singleton)


參考 大話設計模式
定義:保證一個類別僅有一個實體,並提供一個存取它的全域訪問點。
使用時機:系統中某項資源只能有一個,使用這個設計,可以確保物件個體只有一個。

結構圖:來源
2011-04-25_221408

說明:定義一個 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;
        }

    }

靜態初始化: 
2011-4-25 下午 11-34-35
以上兩個範例都可以在多執行緒下執行,具有 thread safe
其中, readonly 欄位則是可以在宣告或是在建構函式中初始化。

0 Comments:

張貼留言