單例模式的核心,就是全域性只有乙個例項。下面就每一種建立方式分析其優缺點。
1.餓漢式
/**
* 餓漢式
*/public class personhungry
public static personhungry getinstance()
}
2.靜態**塊public class person
private person() {}
public static person getinstance()
}
靜態**塊其實相當於另外一種餓漢式,類載入的時候,物件就會建立,雖說執行緒安全,但是資源浪費。
3.懶漢式1和2
public class personlazy1
/*** 該方式在多執行緒執行下,例項不唯一
*/public static personlazy1 getinstance()
return minstance;
}}
public class personlazy2
/*** 耗效能
*/public synchronized static personlazy2 getinstance()
return minstance;
}}
懶漢式1,在多執行緒的情況下,沒法保證只建立乙個例項物件。所以演變出懶漢式2,這種方式從效果的角度是可以實現單例的,通過synchronized保證了多執行緒的安全性。但是,懶漢式2最大的缺點就是耗效能,不管是否已經建立了例項,每次呼叫getinstance都需要鎖。
4.懶漢式3和4
public class personlazy3
/*** 改進效能,雙重判斷
*/public static personlazy3 getinstance()
}} return minstance;
}}
/**
* 推薦使用的方式
*/public class personlazy4
/*** 改進效能,雙重判斷
*/public static personlazy4 getinstance()
}} return minstance;
}}
5.靜態內部類(推薦使用的方式)public class personstatic
public static personstatic getinstance()
/*** 靜態內部類
*/private static class personstaticholder
}
其實現原理和餓漢式差不多,解決了餓漢式載入類就載入的問題,因為外部類personstatic載入時,其內部類personstaticholder是不會隨著載入的。當第一次執行getinstance時,執行到personstaticholder.instance時,personstaticholder類才開始被載入。其實不管多少個執行緒去呼叫getinstance方法,返回的都是第一次呼叫時建立的物件。這種方法不僅能保證了執行緒的安全性,也保證單例的唯一性,同時也延遲了單例的例項化。
缺點:假如personstatic建立時需要傳入乙個引數,比如context,那麼這種方式實現的單例是不支援。
6.列舉
1、定義乙個需要單例的person類
2、定義列舉類,用於儲存person類物件
public enum personenum
public person getperson()
}
3、呼叫
public class test
}
設計模式 建立型 單例模式
單例模式在整個軟體開發中還是比較常用的,頻繁使用且過程穩定的方法 全域性變數都可以使用該模式,也可以叫做公共類。單例模式需要遵循要麼出現一次,要麼不出現的規則。單例模式不提供外部例項化功能,在內部自已例項化以保證其唯一例項。具體如下 class common public static common...
設計模式 建立型 單例模式
單例模式 singleton 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。單例模式劃分 class singleton 獲取本類例項的唯一全域性訪問點 public static singleton getinstance return instance 物件屬於引用資料型別,和基本資料...
設計模式 建立型 單例模式
英文singleton,又稱單件模式。描述 確保類只有乙個例項,並且提供了乙個全域性訪問點。在應用的某些場景,我們只需要類的乙個例項就夠了,並且我們需要在應用的多個地方 客戶 方便的獲取該例項物件。比如應用中的乙個浮動工具欄,或者是乙個資訊收集器 專門收集應用中的操作資訊 等等。優點 方便的控制僅唯...