天天看點

Singleton模式和Mono-State模式

類和執行個體

對于大多數的類,都可以建立多個執行個體.在需要和不需要時,建立和删除這些執行個體.該過程會伴随着記憶體的配置設定和歸還.

同時,有一些類,應該僅有一個執行個體.該執行個體在程式啟動/結束時被建立和删除.

root對象.通過該對象可以得到系統中的其他對象.

factory對象.用來建立系統中的其他對象.

manager對象.負責管理和控制其他對象.

對于這些對象,如果建立了多份,那麼就會發生邏輯錯誤.

通常情況下,強制對象單一性的機制有些多餘.完全可以在程式啟動時隻建立該對象的一個執行個體.

不過,使用模式能夠傳達我們的意圖(該類僅能有一個執行個體).

代價/收益:如果強制對象單一性的機制是輕量級的.那麼傳達意圖的收益會勝過實施這些機制的代價.

Singleton模式

實作: private new(); private static theInstance; public static

Instance();

收益:

适用于任何類:隻需把類的構造變為private,并增加相應的static變量和方法.

可以透過派生建立.

延遲求值(lazy evaluation):隻有真正使用時,才會建立對象.

代價:

destory()未定義:由于持有Sigleton執行個體的子產品很多,即使将該執行個體=null.随後對其方法的調用仍然會建立另一個新的執行個體.

不能繼承:從Singleton類派生的類不是Singleton.而必須加入static的處理.

效率問題:每次調用Instance()都會進行if判斷,很多情況下,是多餘的.

不透明性:Singleton的使用者不知道其使用的是一個Singleton類.

Mono-State模式

實作: 簡單地把對象的所有變量變成static.而方法都是普通方法(非static).

所有的執行個體,看起來就像具有不同名稱的同一對象一樣.即使目前所有的執行個體都被銷毀,也不會丢失Data.

透明性:Mono-State對象和regular對象在使用上沒有差別.

可派生性:派生類也會共享相同的static var.

多态性: 方法是非靜态的,不同的子類可以基于同樣的static var擁有不同的表現.

不可轉換型: 不能透過派生來把正常類轉換為Mono-State類.

效率: Mono-State對象是真正的對象,建立許多個會有開銷.

記憶體: 隻要建立了,即使還未使用,就已經占用了記憶體.

對比:

Singleton強制結構上的單一性.

Mono-State強制行為上的單一性.

Mono-State的測試case對Singleton是有效的.但是反之不行.

如果希望透過派生去限制一個現存類,并且不介意它的所有調用者都必須要調用instance()來擷取通路權,使用Singleton.

如果希望類的單一性本質對調用者透明,或者使用單一對象的多态派生對象.使用Mono-State.

[Agile Software Development(Principles,Patterns,and Pracitices)]