【揭秘單例模式】如何用面向對象設計實現唯一實例?

提問者:用戶CCGP 發布時間: 2025-06-08 02:37:48 閱讀時間: 3分鐘

最佳答案

單例形式是一種常用的計劃形式,其核心頭腦是確保一個類只有一個實例,並供給一個全局拜訪點。這種形式在資本管理、日記效勞、材料庫連接等方面尤為罕見。本文將深刻探究單例形式的計劃道理、實現方法以及在差別編程言語中的具體利用。

單例形式的基本道理

單例形式經由過程限制一個類只有一個實例,並供給一個拜訪它的全局拜訪點來實現。其基本道理如下:

  1. 私有構造函數:將類的構造函數設置為私有,避免外部經由過程 new 關鍵字直接創建實例。
  2. 靜態實例變數:在類外部創建一個靜態實例變數,用於存儲類的唯一實例。
  3. 靜態拜訪方法:供給一個靜態方法,用於前去類的唯一實例。假照實例尚未創建,則創建一個新的實例;假如曾經存在,則直接前去該實例。

單例形式的實現方法

單例形式重要有以下多少種實現方法:

1. 餓漢式

餓漢式單例在類載入時就破即初始化實例,並持有該實例。這種方法簡單易用,但可能會形成內存的揮霍。

public class Singleton {
    private static final Singleton instance = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return instance;
    }
}

2. 勤漢式

勤漢式單例在第一次挪用 getInstance() 方法時才創建實例。這種方法可能節儉內存,但可能會在多線程情況下呈現線程保險成績。

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

3. 雙重檢查鎖定

雙重檢查鎖定(Double-Checked Locking)是一種在多線程情況下進步單例形式效力的方法。它經由過程在同步塊中再次檢查實例能否為 null 來避免不須要的同步。

public class Singleton {
    private static volatile Singleton instance;

    private Singleton() {}

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

4. 靜態外部類

靜態外部類單例形式利用靜態外部類跟類載入機制保證單例的唯一性。這種方法簡單且保險,且不線程保險成績。

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

    private Singleton() {}

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

5. 羅列實現

羅列實現單例形式是 Java 中最簡單、最保險的方法。羅列範例的每個常量都是唯一的,因此可能直接利用羅列常量作為單例。

public enum Singleton {
    INSTANCE;

    public void whateverMethod() {
    }
}

單例形式的利用處景

單例形式在以下場景中非常有效:

  1. 資本管理:比方材料庫連接池、文件體系操縱等。
  2. 日記效勞:確保全部利用順序利用同一個日記記錄器。
  3. 設置管理:比方載入設置文件、體系參數等。
  4. 緩存:比方緩存材料庫查詢成果、頁面緩存等。

總結

單例形式是一種簡單而富強的計劃形式,它經由過程確保一個類只有一個實例來增加資本耗費,進步體系機能。在現實利用中,應根據具體須要抉擇合適的單例實現方法。

相關推薦