1. 程式人生 > >Java 單例(Singleton)模式

Java 單例(Singleton)模式

-s 避免 構造函數 new 類的構造函數 nbsp p s 載器 利用

一、什麽是單例模式:

單例模式是一種確保了一個類只有一個實例,而且自行實例化並向整個系統提供這個實例。被實例化的類稱為單例類。

二、單例模式的特點:

  1. 單例類只有一個實例。
  2. 單例類必須自行創建自己唯一的實例。
  3. 單例類必須給其他對象提供這個實例。

註意:雖然單例模式和單例類限定了只能有一個實例,但是作為單例模式的推廣,可以推廣到任意且有限多個實例的情況,這時候被稱為多例模式和多例類。

三、單例模式的結構:

技術分享圖片

  1. 一個單例類只有一個實例。
  2. 單例類的實例持有對自己的引用。

四、單例模式的實例化:

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();
 7
8 /** 9 * 私有的默認構造函數 10 */ 11 private HungerSingleton() { 12 } 13 14 /** 15 * 靜態工廠方法 16 */ 17 public static HungerSingleton getInstance() { 18 return HUNGER_SINGLETON; 19 } 20 }
View Code

漢懶式單例類:

與餓漢式單例類相同的是構造函數私有;不同之處在於懶漢式單例類在第一次被引用時將自己實例化,如果加載器是靜態的,懶漢式單例類被加載時不會將自己實例化。

使用了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

懶漢式單例類與餓漢式單例類的比較:

  1. 餓漢式單例類在自己被加載時將自己實例化,即便加載器是靜態的,依舊在加載時實例化自己;懶漢式單例類在第一次被引用時將自己實例化,如果加載器是靜態的,懶漢式單例類被加載時不會將自己實例化。
  2. 從資源利用角度講,懶漢式單例類的資源利用效率高點;從速度和反應時間來講,餓漢式的好點。

Java 單例(Singleton)模式