top
Loading...
Java模式設計之單例模式(二)


在什么情況下使用單例模式

使用單例模式的條件

使用單例模式有一個很重要的必要條件:

在一個系統要求一個類只有一個實例時才應當使用單例模式。反過來說,如果一個類可以有幾個實例共存,那么就沒有必要使用單例類。但是有經驗的讀者可能會看到很多不當地使用單例模式的例子,可見做到上面這一點并不容易,下面就是一些這樣的情況。

例子一

問:我的一個系統需要一些"全程"變量。學習了單例模式后,我發現可以使用一個單例類盛放所有的"全程"變量。請問這樣做對嗎?

答:這樣做是違背單例模式的用意的。單例模式只應當在有真正的"單一實例"的需求時才可使用。

一個設計得當的系統不應當有所謂的"全程"變量,這些變量應當放到它們所描述的實體所對應的類中去。將這些變量從它們所描述的實體類中抽出來, 放到一個不相干的單例類中去,會使得這些變量產生錯誤的依賴關系和耦合關系。

例子二

問:我的一個系統需要管理與數據庫的連接。學習了單例模式后,我發現可以使用一個單例類包裝一個Connection 對象,并在finalize()方法中關閉這個Connection 對象。這樣的話,在這個單例類的實例沒有被人引用時,這個finalize() 對象就會被調用,因此,Connection 對象就會被釋放。這多妙啊。

答:這樣做是不恰當的。除非有單一實例的需求,不然不要使用單例模式。在這里Connection 對象可以同時有幾個實例共存,不需要是單一實例。

單例模式有很多的錯誤使用案例都與此例子相似,它們都是試圖使用單例模式管理共享資源的生命周期,這是不恰當的。

作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗