設計模式-建立型-單例模式

icecho發表於2020-11-05

介紹

單例模式是一種建立型設計模式 ?,能夠保證一個類只有一個例項,並提供一個訪問該例項的全域性節點。

特點

  • 保證一個類只有一個例項。最常見的原因是控制某些共享資源,例如資料庫或檔案的訪問許可權。它的運作方式是這樣的,如果此時你建立了一個物件,過一會你決定再建立一個物件,但是此時你會獲得剛才已經建立好的物件,而不會產生一個新物件。⚠️ 要注意的是,普通建構函式無法實現,建構函式的設計決定了它一定要產生一個新物件。

  • 為該例項提供一個全域性訪問節點,單例模式允許在程式任何地方訪問特定物件。但是它可以保護該例項不會被其他程式碼所覆蓋。

解決方案

將預設建構函式設定為私有,防止其他物件使用單例類的 new 關鍵字進行例項化。

新建一個靜態構造方法作為建構函式。該函式會呼叫私有建構函式來建立物件,無論何時呼叫該方法,它總是會返回相同的物件。

public class Singleton {

    public static Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        ...
        ...
        ...
    }
}

懶漢模式

public static Singleton getInstance() {
    if (Objects.isNull(instance)) {
        instance = new Singleton();
    }
    return instance;
}

這種方式實現起來十分簡單,但是如果多執行緒訪問單例物件,無法保證執行緒安全。

public static synchronized Singleton getInstance() {
    if (Objects.isNull(instance)) {
        instance = new Singleton();
    }
    return instance;
}

使用 synchronized 關鍵字控制多執行緒訪問,同一時刻只有一個執行緒可以進入程式碼塊,確保了執行緒安全。但是這種方式會降低程式執行效率。

public static Singleton getInstance() {
    if (Objects.isNull(instance)) {
        synchronized (Singleton.class) {
            if (Objects.isNull(instance)) {
                instance = new Singleton();
            }
        }
    }
    return instance;
}

使用雙重校驗的方式,既確保了執行緒安全,也不會影響程式執行效率。但是有出現空指標的風險。

public static Singleton getInstance() {
    return StaticSingletonHolder.INSTANCE;
}

private static class StaticSingletonHolder {
    private static final Singleton INSTANCE = new Singleton();
}

使用靜態內部類的方式,確保不會重複建立物件,也不會影響程式效率。並且還是懶載入的方式,記憶體方面也處理的非常好。

餓漢模式

private static final Singleton INSTANCE = new Singleton();

public static Singleton getInstance() {
    return INSTANCE;
}

使用 final 靜態成員變數,當類第一次載入到記憶體中的時候就完成了初始化,保證了執行緒安全。

public static SingletonUsingEnum getInstance() {
    return SingletonUsingEnum.INSTANCE;
}

private enum SingletonUsingEnum {
    INSTANCE;
}

使用列舉的方式,可以保證不會重複建立物件,執行緒安全。還可以避免反射和序列化等帶來的問題。是實現單例模式最好的方式。

總結

這是重新學習單例模式的筆記,其中可能有很多地方寫的不對,寫得不好,歡迎大家指正 ?。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
Hello。

相關文章