Aha!設計模式 37 單例 3

2021-09-09 07:12:55 字數 1432 閱讀 7701

效果

singleton模式有許多優點:

1) 對唯一例項的受控訪問

因為singleton類封裝它的唯一例項,所以它可以嚴格的控制客戶怎樣以及何時訪問它。

對於資料的訪問控制,一般都要解決哪個資料,什麼時候被訪問的問題。這兩個問題中,那個資料的問題更加重要。單例模式保證只有乙個可供使用的例項,剩下的監控就變得很簡單。

2) 縮小名空間

singleton模式是對全域性變數的一種改進。它避免了那些儲存唯一例項的全域性變數汙染名空間。

從執行層面來講全域性變數和單例具有相近的特徵,但是在編譯(編碼)層面有很大的不同。例項通過singleton的類方法取得,這種用法不會象全域性變數那樣占有變數名。

3) 允許對操作和表示的精化

singleton類可以有子類,而且用這個擴充套件類的例項來配置乙個應用是很容易的。你可以用你所需要的類的例項在執行時刻配置應用。

精化這個詞原文是refinement,在這裡應該是細化,具體化的意思。singleton返回的雖然是基類型別,但是由於實際建立物件的處理被封裝在類的內部,所以可以很方便的在生成例項時返回特定子類的物件。

4) 允許可變數目的例項

這個模式使得你易於改變你的想法,並允許singleton類的多個例項。此外,你可以用相同的方法來控制應用所使用的例項的數目。只有允許訪問singleton

例項的操作需要改變。

也許設計者在最開始設想該類只有乙個例項,但是後來想法變了。這時只要保證允許訪問的物件還是乙個,就可以繼續使用單例模式。這種程度變化不會對使用者造成影響。

5) 比類操作更靈活

另一種封裝單件功能的方式是使用類操作(即c++中的靜態成員函式或者是smalltalk中的類方法)。但這兩種語言技術都難以改變設計以允許乙個類有多個例項。此外,c++中的靜態成員函式不是虛函式,因此子類不能多型的重定義它們。

雖然也可以使用類操作(靜態函式)的方式實現單例模式相同的功能,但是由於難以實現多個例項和重新定義操作,還是優先選用單例模式吧。

作者一句話

通過實際的處理封裝在類操作中,

使得所有使用物件的操作流都匯集到乙個點,這樣更加容易監控;

實際生成物件的過程隱藏操作後面對使用者不可見,所以更加容易變更。

注:

本文中藍色粗體文字都引自《設計模式》一書。

Aha!設計模式 78 命令模式 3

結構 參與者 協作 client建立乙個concretecommand物件並指定它的receiver物件。某invoker物件接收該concretecommand物件。invoker呼叫concretecommand物件的執行操作。concretecommand物件呼叫receiver的一些操作以執...

設計模式筆記 3 單例模式

單例類只能有乙個例項 單例類必須自己建立自己的唯一例項 單例類必須提供給所有其他物件這個例項 單例類有私有的構造方法和本身的乙個靜態例項物件 單例類向外界提供乙個可訪問的靜態方法,供外界獲取它的靜態例項。目的 保證乙個類有且僅返回這乙個例項物件。public class singleobject p...

設計模式筆記 3 單例模式

靜態 塊兒方式 懶漢式執行緒安全方式 doublecheck 靜態內部類方式 列舉 保證在整個軟體系統中,對某個類物件只能存在乙個例項,並且提供乙個取得其物件例項的方法。實現構造器私有化,屬性位置建立例項的靜態變數,提供靜態方獲取靜態例項。public class single 靜態例項 priva...