首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 設計模式精講:單例模式與簡單工廠模式深度解析

     編輯:Java 相關知識

單例模式

核心意圖

確保一個類別在全域僅有一個實例,並提供全域存取點。適用於日誌記錄器、配置管理器、資料庫連線池、執行緒池等場景。

兩種經典實現

1. 餓漢式(類載入時建立)

public final class Singleton {
    private static final Singleton INSTANCE = new Singleton();
    private Singleton() {} // 私有建構子
    public static Singleton getInstance() { return INSTANCE; }
}
  • 優點:簡單、線程安全(JVM 類載入機制保證)、無同步開銷。
  • 缺點:若實例從未使用仍會建立,浪費記憶體;無法處理建構子拋出的異常。

2. 懶漢式(雙重檢查鎖定 DCL)

public final 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;
    }
}
  • volatile 禁止指令重排,確保其他執行緒看到完全初始化的物件。
  • 優點:延遲載入、線程安全、效能較好(僅首次同步)。
  • 缺點:代碼稍複雜;若被不同類載入器載入,仍可能產生多實例。

進階話題

  • 序列化破壞單例:實作 readResolve() 返回唯一實例。
  • 反射攻擊:建構子中拋出異常阻止第二次實例化。
  • 枚舉單例(推薦):public enum Singleton { INSTANCE; } 天然防序列化/反射破壞,簡潔安全。

簡單工廠模式

核心意圖

由一個工廠類別根據傳入參數決定建立哪個具體產品類別,封裝物件建立細節,客戶端僅面向抽象產品介面。

結構角色

  • Product(抽象產品):定義產品介面。
  • ConcreteProduct(具體產品):實作介面。
  • Factory(工廠):含建立邏輯的靜態方法或實例方法。

代碼範例:圖形繪製

interface Shape { void draw(); }
class Circle implements Shape { public void draw() { System.out.println("畫圓"); } }
class Rectangle implements Shape { public void draw() { System.out.println("畫矩形"); } }

class ShapeFactory {
    public static Shape create(String type) {
        switch (type.toLowerCase()) {
            case "circle": return new Circle();
            case "rect": return new Rectangle();
            default: throw new IllegalArgumentException("未知形狀: " + type);
        }
    }
}

// 客戶端
Shape s = ShapeFactory.create("circle");
s.draw(); // 輸出:畫圓

優缺點與演進

優點缺點
客戶端解耦具體類別新增產品需修改工廠類,違反開閉原則
集中管理建立邏輯工廠職責過重,單點故障風險

當產品族固定、變動少時適用;頻繁擴展產品類型請改用工廠方法模式或抽象工廠模式。

總結對比

模式核心解決問題關鍵實現點典型應用
單例全域唯一實例私有建構子 + 靜態工廠方法 + volatile/DCL/枚舉Logger、Config、ConnectionPool
簡單工廠封裝物件建立靜態工廠方法 + switch/if 判斷類型圖形、資料庫驅動、解析器
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved