知識來源:http://how2j.cn/k/class-object/class-object-singleton/349.html#nowherehtml
1、什麼是單例模式java
2、單例模式的特性數據庫
單例模式的三要素:設計模式
1. 構造方法私有化
2. 靜態屬性指向實例
3. public static的 getInstance方法,返回實例對象的靜態屬性安全
3、單例模式分爲懶漢和餓漢模式ide
3.1餓漢模式性能
public class GiantDragon { //私有化構造方法使得該類沒法在外部經過new 進行實例化 private GiantDragon(){ } //準備一個類屬性,指向一個實例化對象。 由於是類屬性,因此只有一個 private static GiantDragon instance = new GiantDragon(); //public static 方法,提供給調用者獲取12行定義的對象 public static GiantDragon getInstance(){ return instance; } }
public class GiantDragon { //私有化構造方法使得該類沒法在外部經過new 進行實例化 private GiantDragon(){ } //準備一個類屬性,用於指向一個實例化對象,可是暫時指向null private static GiantDragon instance; //public static 方法,返回實例對象 public static GiantDragon getInstance(){ //第一次訪問的時候,發現instance沒有指向任何對象,這時實例化一個對象 if(null==instance){ instance = new GiantDragon(); } //返回 instance指向的對象 return instance; } }
餓漢式是當即加載的方式,不管是否會用到這個對象,都會加載。
若是在構造方法裏寫了性能消耗較大,佔時較久的代碼,好比創建與數據庫的鏈接,那麼就會在啓動的時候感受稍微有些卡頓。
懶漢式,是延遲加載的方式,只有使用的時候纔會加載。 而且有線程安全的考量。
使用懶漢式,在啓動的時候,會感受到比餓漢式略快,由於並無作對象的實例化。 可是在第一次調用的時候,會進行實例化操做,感受上就略慢。
看業務需求,若是業務上容許有比較充分的啓動和初始化時間,就使用餓漢式,不然就使用懶漢式。spa
一些設計模式文檔顯示懶漢模式多個線程時會出現內存中就有兩個實例(線程A判斷實例有沒有指向對象,另外一線程正在實例化,就會實例化倆個對象,引發業務錯誤)但概率微乎其微線程