實現 singleton 模式的辦法通常有三種.
一. 用靜態方法實現 singleton 這種方法是使用靜態方法來監視例項的建立.為了防止建立乙個以上的例項,我們最好把構造器宣告為 private.
這樣可以防止客戶程式設計師通過除由我們提供的方法之外的任意方式來建立乙個例項,如果不把構造器宣告為private,編譯器就會自作聰明的自動同步乙個預設的friendly構造器.這種實現方法是最常見的,也就是圖1中結構的標準實現.
public class singleton ;
/*** class method to access the singleton instance of the class.
*/public static singleton getinstance()
}// 測試類
class singletontest
} singletontest執行結果是:
s1 is the same instance with s2
這證明我們只建立了乙個例項.
二. 以靜態變數為標誌實現 singleton 在類中嵌入乙個靜態變數做為標誌,每次都在進入構造器的時候進行檢查.
問題在於構造器沒有返回型別,如果確定建立乙個例項成功與否.乙個方法是呼叫乙個函式來檢查建立是否成功,然後簡單的返回乙個來自靜態變數的值,但是這樣做是不優雅的,而且容易發生錯誤.比較好的做法是建立乙個當建立了乙個以上的例項時可以丟擲異常的類,這個類僅僅是呼叫父類方法,好處是用了自己命名的異常型別,錯誤資訊更加清晰:
class singletonexception extends runtimeexception
}class singleton
}// 測試類
public class singletontest catch (singletonexception e)
// try to create another spooler --should fail
system.out.println("creating two instance");
try catch (singletonexception e) }}
singletontest執行結果是:
creating one instance
creating two instance
only one instance allowed
可以看出,第乙個例項順利建立,第二個例項建立實丟擲了我們自定義的異常.
三. 用註冊器機制來建立 singleton 首先用集合中的hashtable 和enumeration來實現additem(object key, object value),getitem(object key), ,removeitem(object key)等方法實現乙個管理器,將key和value一一關聯起來,客戶程式設計師建立例項前首先用additem方法進行註冊,再用getitem方法獲取例項.hashtable中的key是唯一的,從而保證建立的例項是唯一的,具體實現限於篇幅不再細說,在prototype模型的應用一文中我將會給出乙個實現註冊器的**.用註冊器機制來建立 singleton模式的好處是易於管理,可以同時控制多個不同型別的singleton 例項.
四中方式實現單例模式
一 餓漢式單例模式 package com.zkn.newlearn.gof.singleton 餓漢式單例模式 author zkn public class singletontest01 返回這個物件 public static singletontest01 getinstance publ...
四中方式實現單例模式
一 餓漢式單例模式 package com.zkn.newlearn.gof.singleton 餓漢式單例模式 author zkn public class singletontest01 返回這個物件 public static singletontest01 getinstance publ...
Python中單例模式的實現方式
在 python 中,我們可以用多種方法來實現單例模式 使用模組 其實,python 的模組就是天然的單例模式,因為模組在第一次匯入時,會生成.pyc檔案,當第二次匯入時,就會直接載入.pyc檔案,而不會再次執行模組 因此,我們只需把相關的函式和資料定義在乙個模組中,就可以獲得乙個單例物件了。如果我...