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

Java 設計模式實戰:單例模式(餓漢/懶漢/雙檢鎖)與工廠模式(簡單/工廠方法/抽象工廠)完整代碼詳解

     編輯:Java 相關知識

創建型模式中,單例與工廠是最高頻、最基礎的模式。本文提供 **六種單例寫法** 與 **三層工廠模式** 的完整、可運行代碼,並分析線程安全、性能、適用場景差異。

一、單例模式:確保全局唯一實例

1. 餓漢式(類加載時創建,天然線程安全)

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

優點:簡單、無鎖、類加載機制保證線程安全。缺點:類加載即創建,可能造成資源浪費。

2. 懶漢式(首次調用創建,需同步)

public class Singleton {
    private static Singleton instance;
    private Singleton() {}
    public static synchronized Singleton getInstance() { // 方法級鎖,性能差
        if (instance == null) instance = new Singleton();
        return instance;
    }
}

3. 雙重檢查鎖(DCL,JDK 5+ volatile 保證可見性)

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 Singleton() {}
    private static class Holder { static final Singleton INSTANCE = new Singleton(); }
    public static Singleton getInstance() { return Holder.INSTANCE; }
}

5. 枚舉單例(Effective Java 作者推薦,防反射/序列化破壞)

public enum Singleton { INSTANCE; }

6. 容器管理單例

Spring @Scope("singleton")、EJB @Singleton 等框架級單例。

二、工廠模式:封裝對象創建邏輯

1. 簡單工廠(非標準模式,但實用)

public class SimpleFactory {
    public static Product create(String type) {
        switch (type) {
            case "A": return new ProductA();
            case "B": return new ProductB();
            default: throw new IllegalArgumentException();
        }
    }
}

2. 工廠方法模式(標準 GoF,開閉原則)

interface Product { void use(); }
interface Factory { Product create(); }

class ProductA implements Product { public void use() { System.out.println("A"); } }
class FactoryA implements Factory { public Product create() { return new ProductA(); } }

// 客戶端
Factory factory = new FactoryA();
Product p = factory.create(); p.use();

新增產品只需新增對應 Factory 實現,**不修改原有代碼**。

3. 抽象工廠模式(產品族)

interface Product1 { void show(); }
interface Product2 { void show(); }
interface Factory { Product1 create1(); Product2 create2(); }

class FactoryImpl implements Factory {
    public Product1 create1() { return new Product1Impl(); }
    public Product2 create2() { return new Product2Impl(); }
}

// 客戶端
Factory f = new FactoryImpl();
f.create1().show(); f.create2().show();

適用於**一組相關/依賴對象**需一起創建的場景(如不同皮膚主題的按鈕+輸入框+窗口)。

三、模式對比總結

模式核心意圖關鍵點適用場景
單例全局唯一訪問點私有構造、靜態實例、靜態工廠方法配置管理、連接池、緩存、日誌
簡單工廠集中創建邏輯靜態方法分發產品固定、客戶端不關心創建細節
工廠方法延遲創建到子類抽象工廠介面、具體工廠實現框架擴展點、插件系統
抽象工廠創建產品族多產品介面、工廠創建多產品跨平台 UI、多数據庫適配

四、避坑指南

  • 單例:防反射破壞(構造器拋異常)、防序列化破壞(readResolve)、枚舉最強
  • 工廠:避免過度設計,簡單場景直接 new 或簡單工廠即可
  • 依賴倒置:客戶端依賴抽象介面,而非具體實現

掌握這些核心創建型模式,是構建可擴展、可維護 Java 系統的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved