java設計模式之單例模式

   單例模式顧名思義,即爲只有一個實例。然後,我們需要考慮如何才能保證一個類只有一個實例。也就是說,一個類能有一個對象,即只能被new一次。這樣就可能會有人斷言,那是不可能的,只要能new就會有多個對象。所以,我們需要解決的第一個問題就是如何控制對象的創建。

   1、控制對象的創建

   爲了控制對象的創建,我們可以將其構造函數私有化。這樣就只有我自己可以來構造我自己,其他人是沒有權限的。我自己來構建自己那又怎麼能保證在“別人”需要時,我已經將自己構建出來,並且可以給別人用能。所以,我們需要擁有一個靜態的屬性,這個屬性就是我們自己。使用這個屬性來保存我們自己。可以在適當的時候,將我們自己new出來,然後存儲到這個屬性裏面。然後,我們就會遇到一個問題,就是怎麼給別人?

   2、如何提供實例

   如果我們將指向自己的實例,的訪問控制設置成public的。那麼,我們就不能保證他的安全性,因爲如果這樣的話,就會有很多人都可以過來修改它。一旦修改了它,那麼,如果再有人過來訪問,那麼就會出現很悲催的情況。所以,我們需要將這個屬性設置爲私有的即private的。然後,我們可以提供一個public的get方法來,保證大家都可以來訪問這個屬性。但是卻不能修改這個屬性。

   3、何時纔是“適當的時候”?

   在解決第一個問題的時候,我們提出了一個適當的時候創建一個對象。那麼,什麼時候纔是適當的時候呢?解決這個問題有兩種解決方案:a、在創建這個類的時候,就將其對象實例化(這也就是傳說中的餓漢模式)b、在需要的時候才創建,即在調用get方法是判斷一下是否已經創建實例,如果已經創建那麼直接返回,如果沒有創建,那麼創建一個實例並返回(這也就是傳說中的懶漢模式)。

   餓漢模式和懶漢模式對於不同的語言,有不同的適應性。對於Java來說,餓漢模式是比較好的。而針對於C/C++來說懶漢模式比較好。這是語言本身所決定的。這也是大家爲什麼在看C/C++的書的時候,一般作者都是給出懶漢模式的實現,而不給出餓漢模式。而如何是看的java相關的書籍,那麼,作者這一般就會緊緊給出一個餓漢模式的實現。因爲在Java裏面,雙檢查成例(這個是C/C++在解決懶漢模式對多線程環境的適應問題時,提出的比較成熟的解決方案)是不成立的。

   



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章