目的
確保類別只會有一個物件實體存在,並提供單一存取窗口。
動機
有時我們只想要一個物件實體 :
- 只會有一個列印佇列(print spooler)為所有的印表機服務
比較好的做法,就是類別自己負責,讓自己只會有一個實體。
範例
參與者
- Singletion : 唯一的 Instance ,讓外界只能存取他唯一的實體。
所以類別可以定義成 :
Protected Contructor可以避免該類別在其他地方被實體化, 所以其他地方呼叫時就無法使用 new 將他實體化
只能使用 GetSingletion 存取該實體,所以就能確保只有一個實體 :
多執行緒 – 雙重鎖定
在多執行緒,你可能需要確保只有一個實體化對象
但可能很巧的,同時有兩支以上的執行緒剛好都執行到 uniqueInstance,所以導致程式錯亂。
雙重鎖定就是在 lock 裡面多判斷一次,讓機率降低 :