Java 單例(Singleton)模式
阿新 • • 發佈:2019-03-05
-s 避免 構造函數 new 類的構造函數 nbsp p s 載器 利用 餓漢式單例類:
一、什麽是單例模式:
單例模式是一種確保了一個類只有一個實例,而且自行實例化並向整個系統提供這個實例。被實例化的類稱為單例類。
二、單例模式的特點:
- 單例類只有一個實例。
- 單例類必須自行創建自己唯一的實例。
- 單例類必須給其他對象提供這個實例。
註意:雖然單例模式和單例類限定了只能有一個實例,但是作為單例模式的推廣,可以推廣到任意且有限多個實例的情況,這時候被稱為多例模式和多例類。
三、單例模式的結構:
- 一個單例類只有一個實例。
- 單例類的實例持有對自己的引用。
四、單例模式的實例化:
Java中單例模式有著自己的特點,具體表現在單例類的實例化上:
餓漢式單例類:
Java中最簡單的單例類,類的單例被聲明為靜態變量,在類加載時,調用類的私有構造函數,靜態變量被實例化。
特點:類的構造函數私有,避免了外界利用構造函數創建任意多的實例。且由於構造函數私有,類不能被繼承。
1 /** 2 * @author ZhouDX 3 * @since 2019/3/4 22:12:28 4 */ 5 public class HungerSingleton { 6 private static final HungerSingleton HUNGER_SINGLETON = new HungerSingleton(); 7View Code8 /** 9 * 私有的默認構造函數 10 */ 11 private HungerSingleton() { 12 } 13 14 /** 15 * 靜態工廠方法 16 */ 17 public static HungerSingleton getInstance() { 18 return HUNGER_SINGLETON; 19 } 20 }
漢懶式單例類:
與餓漢式單例類相同的是構造函數私有;不同之處在於懶漢式單例類在第一次被引用時將自己實例化,如果加載器是靜態的,懶漢式單例類被加載時不會將自己實例化。
使用了synchronized對靜態工廠類方法進行了同步,已處理多線程的問題
1 /** 2 * @author ZhouDX 3 * @since 2019/3/4 22:23:02 4 */ 5 public class LazySingleton { 6 private LazySingleton lazySingleton = null; 7 8 /** 9 * 構造函數 10 */ 11 private LazySingleton() { 12 } 13 14 /** 15 * 靜態工廠方法,返回懶漢式實力類的唯一實例 16 * 17 * @return 18 */ 19 synchronized public LazySingleton getInstance() { 20 if (lazySingleton == null) { 21 return lazySingleton = new LazySingleton(); 22 } 23 return lazySingleton; 24 } 25 26 }View Code
懶漢式單例類與餓漢式單例類的比較:
- 餓漢式單例類在自己被加載時將自己實例化,即便加載器是靜態的,依舊在加載時實例化自己;懶漢式單例類在第一次被引用時將自己實例化,如果加載器是靜態的,懶漢式單例類被加載時不會將自己實例化。
- 從資源利用角度講,懶漢式單例類的資源利用效率高點;從速度和反應時間來講,餓漢式的好點。
Java 單例(Singleton)模式