Intent
保證一個類只有一個執行個體,並且提供對該執行個體的一個全域訪問點。
Motivation
對某些類來說,確保只有一個執行個體是非常重要的。雖然系統中可以由多台印表機,但是應該只有一個印表機假離線(spooler)(如來熊評論:是誰把spooler翻譯成假離線的?實在是晦澀之極,相應的是不是還有真離線呢?其實直接翻譯成“調度器”不是更容易接受嗎?)。應該只有一個檔案系統和一個視窗管理器。一個數位過濾器中只有一個A/D轉換器。一家公司只能由一套會計系統。
我們怎樣確保一個類只有一個執行個體,同時該執行個體可以很容易被訪問到?一個全域變數是一個對象隨處可被訪問,但是並不能保證不會有多個對象被執行個體化。
更好地解決方案是讓這個類自己負責跟蹤自己的執行個體,自己確保不會有其他的執行個體被建立(截住建立新對象的請求),自己提供訪問實力的方法。這就是單件(Singleton)模式。
Applicability
1. 一個類必須確保僅有一個執行個體,向Client提供公開(well-known)的訪問點。
2. 當該執行個體需要通過子類化進行擴充時,Client應該不需要修改代碼就可以直接使用擴充後的執行個體。
Structure
Participants
-Singleton
定義了一個Instance操作,可以讓Client訪問唯一的執行個體。Instance是一個類操作。(對C++來說,就是一個靜態成員函數)。
可以負責建立自己的唯一執行個體。
Collaborations
Client訪問單件執行個體完全通過單件的Instance操作進行。
Consequences
-好處
1。 控制對唯一執行個體的訪問
因為單件類封裝了唯一執行個體,可以對Client如何以及何時訪問該執行個體進行嚴格地控制。
2。減少名字空間的佔用。
單件模式是對全域變數的一個改進。可以避免使用全域變數儲存唯一執行個體對名字空間造成的汙染。
3。允許對操作和表達進行精化
單件類可以子類化,並且很容易將應用程式配置成使用該擴充後執行個體的方式運行。可以在應用程式運行時配置成需要的執行個體。
4。允許可變數目的執行個體。
單件模式允許單件類的多個執行個體存在。此外,你可以使用相同的方式來控制應用程式使用的執行個體數目。只需要修改提供對執行個體訪問的操作就可以了。
5。比類操作更靈活
提供單件功能的另外一個辦法就是使用類操作(對C++來說就是靜態成員函數)。但是這些語言技術使得修改設計以支援多個執行個體變得困難。此外,C++的靜態成員函數不能是virtual的,這樣就無法通過overriding的子類化來實現多態。