單例模式
1.餓漢式單例類(lèi)
public class Singleton {
private Singleton(){}
//在自己內(nèi)部定義自己一個(gè)實(shí)例,是不是很奇怪?
//注意這是private 只供內(nèi)部調(diào)用
private static Singleton instance = new Singleton();
//這里提供了一個(gè)供外部訪(fǎng)問(wèn)本class的靜態(tài)方法,可以直接訪(fǎng)問(wèn)
public static Singleton getInstance() {
return instance;
}
}
2.懶漢式單例類(lèi)
public?class?Singleton2?{
????//私有的默認(rèn)構(gòu)造子
????private?Singleton2()?{}
????
????//注意,這里沒(méi)有final????
????private?static?Singleton2?single;
????
????//只實(shí)例化一次
????static{
????????single?=?new?Singleton2();
????}
????
????//靜態(tài)工廠(chǎng)方法?
????public?synchronized??static?Singleton2?getInstance()?{
?????????if?(single?==?null)?{??
?????????????single?=?new?Singleton2();
?????????}??
????????return?single;
????}
}
??????? 上面給出懶漢式單例類(lèi)實(shí)現(xiàn)里對(duì)靜態(tài)工廠(chǎng)方法使用了同步化,以處理多線(xiàn)程環(huán)境。有些設(shè)計(jì)師在這里建議使用所謂的"雙重檢查成例".必須指出的是,"雙重檢查成例"不可以在Java 語(yǔ)言中使用。不十分熟悉的讀者,可以看看后面給出的小節(jié)。 同樣,由于構(gòu)造子是私有的,因此,此類(lèi)不能被繼承。餓漢式單例類(lèi)在自己被加載時(shí)就將自己實(shí)例化。即便加載器是靜態(tài)的,在餓漢式單例類(lèi)被加載時(shí)仍會(huì)將自己實(shí)例化。單從資源利用效率角度來(lái)講,這個(gè)比懶漢式單例類(lèi)稍差些。從速度和反應(yīng)時(shí)間角度來(lái)講,則比懶漢式單例類(lèi)稍好些。然而,懶漢式單例類(lèi)在實(shí)例化時(shí),必須處理好在多個(gè)線(xiàn)程同時(shí)首次引用此類(lèi)時(shí)的訪(fǎng)問(wèn)限制問(wèn)題,特別是當(dāng)單例類(lèi)作為資源控制器,在實(shí)例化時(shí)必然涉及資源初始化,而資源初始化很有可能耗費(fèi)時(shí)間。這意味著出現(xiàn)多線(xiàn)程同時(shí)首次引用此類(lèi)的機(jī)率變得較大。
3.單例模式 -- 雙重檢查鎖機(jī)制
public?class?DoubleLockSingleton?{
????private?static?DoubleLockSingleton?instance?=?null;
????private?DoubleLockSingleton()?{
????}
????public static DoubleLockSingleton?getInstance()
???{
?????if (instance == null)
?????{
?????? synchronized(DoubleLockSingleton?.class) {? //1
???????? if (instance == null)????????? //2
?????????? instance = new DoubleLockSingleton?();? //3
?????? }
???? }
???? return instance;
???}
}
Singleton的好處還在于可以節(jié)省內(nèi)存,因?yàn)樗拗屏?br />實(shí)例的個(gè)數(shù),有利于Java垃圾回收(garbage collection)。
?
4.發(fā)明者是Google公司的Bob lee:
?public?? class? Singleton?? {??
?
?? static?? class? SingletonHolder?? {??
???? static? Singleton instance? =?? new? Singleton();??
? }???
?
?? public?? static? Singleton getInstance()?? {??
???? return? SingletonHolder.instance;??
? }???
?
}
posted on 2010-01-14 22:55 飛熊 閱讀(222) 評(píng)論(0) 編輯 收藏 所屬分類(lèi): java設(shè)計(jì)模式