1. 程式人生 > >單例設計模式--餓漢式與懶漢式小結

單例設計模式--餓漢式與懶漢式小結

單例設計模式(Singleton)也叫單態設計模式

什麼是單例設計模式?

單例設計模式  要求一個類有且僅有一個例項,並且提供了一個全域性的訪問點。這個單例不應該由人來控制,而應該由程式碼來限制。

單例設計模式的思路:

  1.私有化建構函式

  2.私有化靜態類變數

  3.對外提供獲取例項的方法

常見的單例設計模式有兩種:懶漢式,餓漢式

1,餓漢式--靜態常量--類變數直接例項化

public class Singleton1 {
    //1.私有化建構函式
    private Singleton1() {
    }
    //2.私有化靜態類變數並直接例項化---類載入的時候就完成了例項化,final對於不同的應用場景可加可不加。
private final static Singleton1 INSTANCE = new Singleton1(); //3.對外提供獲取該例項的方法 public static Singleton1 getInstance() { return INSTANCE; } }

小結:

  優點:寫法簡單,類載入的時候就完成了例項化,避免了執行緒同步不安全的問題。

  缺點:正由於類載入就完成例項化的特點,如果一直未使用該例項,那麼就會造成記憶體的浪費。

2.餓漢式--靜態程式碼塊---類變數在靜態程式碼塊中被例項化

public
class Singleton1 { //1.私有化建構函式 private Singleton1() { } //2.私有化靜態類變數,並在靜態程式碼塊中為該變數賦值 private static Singleton1 INSTANCE; static { INSTANCE = new Singleton1(); } //3.對外提供獲取該例項的方法 public static Singleton1 getInstance() { return INSTANCE; } }

小結:(其實這種寫法與上面的寫法類似,只是將直接賦值操作轉移到了靜態程式碼塊中間接賦值,其實現原理相同,都是在類載入的時候完成了例項化)

  優點:寫法簡單,類載入的時候就完成了例項化,避免了執行緒同步不安全的問題。

  缺點:正由於類載入就完成例項化的特點,如果一直未使用該例項,那麼就會造成記憶體的浪費。

3.懶漢式--雙重(判斷)加鎖機制

public class Singleton {

    //1.私有化建構函式
    private Singleton() {
    }
    //2.宣告私有靜態變數
    private static Singleton instance;
    //3.給外界提供獲取物件的方法
    public static Singleton getInstance() {
        if (null == instance) {
            synchronized (Singleton.class) {
                if (null == instance) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

小結:

  這種寫法是懶漢式單例設計模式較優的寫法,實現了執行緒安全、延遲載入、效能較優。

4.懶漢式--靜態內部類

public class Singleton {

    //1.私有化建構函式
    private Singleton() {
    }
    //2.靜態內部類:靜態內部類在外部類Singleton載入的時候不會被例項化,
    //  而是在呼叫getInstance方法時,才會被載入完成例項化,這個特點為我們實現了延遲載入。
    //  同時靜態內部類只會在第一次載入的時候完成初始化,而在初始化過程中其他執行緒無法進入(JVM的功勞),從而保證了執行緒安全。
    private static class SingletonInstance{
        private static final Singleton INSTANCE = new Singleton();
    }
    //3.對外提供獲取例項的方法
    public static Singleton getInstance() {
        return SingletonInstance.INSTANCE;
    }
}

小結:

  這種設計模式完美的解決了餓漢式沒有延遲載入的弊端,良好的解決了記憶體浪費問題。具有執行緒安全、延遲載入、效率高特點。

 

單例設計模式的應用場景

  1.工具類物件

  2.建立物件時耗時過多或者消耗資源過多,但又經常使用的物件。比如:JDBC連線物件Connection,Redis連線物件Jedis等

  3.頻繁建立和銷燬的物件