意圖
保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。
別名
單例類、單例模式
動機
有些系統的類僅能有一個實例,并且希望易于訪問。如文件系統,窗口管理器。
適用性
- 當類只能有一個實例而且客戶可以從一個眾所周知的訪問點訪問它時。
- 當這個單例應該通過子類化可擴展為別的單例,并且客戶應該無需更改代碼就能使用拓展出來的單例時。(參見單件注冊表)
結構

參與者
- Singleton:
- 定義一個Instance操作,允許客戶訪問它的唯一實例。Instance是一個類操作。(即C++中的一個靜態成員函數)
- 可能負責創建它自己的唯一實例。
協作
客戶只能通過Singleton的Instance操作訪問一個Singleton的實例。
效果
- 對唯一實例的受控訪問。因為Singleton類封裝它的唯一實例,所以它可以嚴格的控制客戶怎樣以及何時訪問它。
- 縮小名稱空間。通過將原本需要全局的變量統統放進Singleton類中,可以達到縮小名稱空間的目的,避免污染名稱空間。
- 允許對操作和表示的精化。Singleton類可以有子類,可以通過這個子類的實例來配置一個應用。
- 允許可變數目的實例。可以讓Singleton類有多個實例,你可以用相同的方法來控制應用所使用的實例的數目。
- 比類操作更靈活。Singleton模式相比類操作(即C++中的靜態成員函數,類擁有的操作,而不是對象擁有的操作。所有類實例共享一個類操作。)更加靈活。若采用類操作,C++中的靜態成員函數不是虛函數,因此子類不能多態的重定義它們。(采用Singleton模式則不會有這種問題。)
實現
- 保證一個唯一的實例。
- 我們不知道多個單件的調用順序,所以單件之間不能存在依賴關系。
- 創建Singleton類的子類。(參見單件注冊表)