Fork me on GitHub

4/18/2011

[DP] Singleton 獨體模式



獨體模式(Singleton):保證一個類別僅有一個實體,並提供一個存取它的全域訪問點。

「可以使用一個總體變數使得一個物件被存取 (1),但它不能防止你實體化多個物件。一個最好的辦法就是,讓類別自身負責保存它的唯一實體。這個類別可以保證沒有其他的實體被建立,並提供一個存取該實體的方法 (2)」

(1) 在用戶端,事先宣告一個變數,檢查其是否為 null,如果為 null 才 create,非 null 則不動作。
缺點:此時考慮該物件實體化的問題落在用戶端身上

(2) 宣告一個 static 的自身(Singleton) 變數,並且將建構式私有化 (private constructor),然後一個 static 的方法 GetInstance() 存取唯一的自身變數。GetInstance() 當中的實現會去檢查自身變數是否已經被建立,「否」則建立返回,「是」則單純返回。

優點:用戶端不再考慮使否需要去實體化的問題,而把責任都給了應該負責的類別去處理

注意事項:多執行緒同時存取 Singleton 類別,調用 GetInstance() 方法,會有可能造成建立多個實體。這時必須給行程 lock 來處理。lock 是確保一個執行緒位於程式碼臨界區時,另一個執行緒不進入臨界區。如果其他執行緒試圖進入鎖定的程式碼,則它將一直等待 (即被阻止),直到該物件被釋放。

參考:大話設計模式。

... ...

No comments:

Post a Comment