意圖
保證一個類僅有一個實例拄查,并提供一個訪問它的全局訪問點吁津。
別名
單例類、單例模式
動機
有些系統(tǒng)的類僅能有一個實例堕扶,并且希望易于訪問碍脏。如文件系統(tǒng),窗口管理器稍算。
適用性
- 當類只能有一個實例而且客戶可以從一個眾所周知的訪問點訪問它時典尾。
- 當這個單例應該通過子類化可擴展為別的單例,并且客戶應該無需更改代碼就能使用拓展出來的單例時糊探。(參見單件注冊表)
結構
![](https://raw.githubusercontent.com/iDragonfly2050/iDragonfly-File/master/Blog/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/71b4fc8b-519f-4e51-9424-dfff18758c80.png)
參與者
- Singleton:
- 定義一個Instance操作钾埂,允許客戶訪問它的唯一實例河闰。Instance是一個類操作。(即C++中的一個靜態(tài)成員函數(shù))
- 可能負責創(chuàng)建它自己的唯一實例褥紫。
協(xié)作
客戶只能通過Singleton的Instance操作訪問一個Singleton的實例姜性。
效果
- 對唯一實例的受控訪問。因為Singleton類封裝它的唯一實例髓考,所以它可以嚴格的控制客戶怎樣以及何時訪問它部念。
- 縮小名稱空間。通過將原本需要全局的變量統(tǒng)統(tǒng)放進Singleton類中氨菇,可以達到縮小名稱空間的目的儡炼,避免污染名稱空間。
- 允許對操作和表示的精化查蓉。Singleton類可以有子類射赛,可以通過這個子類的實例來配置一個應用。
- 允許可變數(shù)目的實例奶是¢乖穑可以讓Singleton類有多個實例,你可以用相同的方法來控制應用所使用的實例的數(shù)目聂沙。
- 比類操作更靈活秆麸。Singleton模式相比類操作(即C++中的靜態(tài)成員函數(shù),類擁有的操作及汉,而不是對象擁有的操作沮趣。所有類實例共享一個類操作。)更加靈活坷随。若采用類操作房铭,C++中的靜態(tài)成員函數(shù)不是虛函數(shù),因此子類不能多態(tài)的重定義它們温眉。(采用Singleton模式則不會有這種問題缸匪。)
實現(xiàn)
- 保證一個唯一的實例。
- 我們不知道多個單件的調用順序类溢,所以單件之間不能存在依賴關系凌蔬。
- 創(chuàng)建Singleton類的子類。(參見單件注冊表)