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

Java 三大工廠模式深度解析:簡單工廠、工廠方法、抽象工廠

     編輯:Java 綜合教學

前言:工廠模式家族全景

工廠模式是創建型模式核心,核心意圖:封裝對象創建邏輯,解耦使用者與具體實現。按抽象程度遞增分為三類:

模式核心角色適用場景開閉原則
簡單工廠 (Simple Factory)一個工廠類 + 判斷邏輯產品較少、固定、客戶端只需傳參數產品開放/修改關閉,工廠類違反
工廠方法 (Factory Method)抽象工廠接口 + 多個具體工廠產品擴展頻繁、需符合開閉原則完全符合
抽象工廠 (Abstract Factory)抽象工廠 + 多產品族 + 多產品等級多產品族、系統只消費某一族產品完全符合

一、適用場景判斷指南

🎯 何時使用工廠模式?

  1. 動態實現選擇:運行時根據條件 (配置/環境/參數) 決定具體實現 (如數據庫驅動、支付渠道)
  2. 複雜初始化封裝:對象創建涉及多步驟、依賴外部資源、需緩存/池化 (如連接池、線程池)
  3. 組合聚合對象:大對象由多個可替換子組件構成 (如電腦組裝、汽車製造)
  4. 接口編程解耦:客戶端只依賴抽象接口,不依賴具體類

二、簡單工廠模式 (Simple Factory) - 「集中式創建」

2.1 角色結構

  • 工廠類 (Driver):核心,包含判斷邏輯 if/else 或 switch
  • 抽象產品 (Car):接口/抽象類,定義公共行為
  • 具體產品 (Benz/BMW/Audi):實現抽象產品

2.2 代碼實現

// 抽象產品
public interface Car {
    void drive();
}

// 具體產品
public class Benz implements Car {
    public void drive() { System.out.println("駕駛奔馳..."); }
}
public class BMW implements Car {
    public void drive() { System.out.println("駕駛寶馬..."); }
}

// 工廠類 (上帝類/全能類)
public class Driver {
    public static Car driveCar(String type) {
        if ("Benz".equalsIgnoreCase(type)) return new Benz();
        else if ("BMW".equalsIgnoreCase(type)) return new BMW();
        // else if ... 新增產品必須修改此處 ❌
        throw new IllegalArgumentException("不支持的車型: " + type);
    }
}

// 客戶端
public class Magnate {
    public static void main(String[] args) {
        Car car = Driver.driveCar("Benz"); // 只需知道參數
        car.drive();
    }
}

2.3 優缺點評析

優點缺點
客戶端極簡:只需傳參數工廠類職責過重,違反單一職責
創建邏輯集中,易維護新增產品需修改工廠代碼,違反開閉原則
靜態工廠方法調用便捷產品族擴展困難,只支持單一產品等級

三、工廠方法模式 (Factory Method) - 「延遲到子類」

3.1 角色結構 (四角色)

  • 抽象工廠 (Driver):聲明工廠方法 Car driveCar()
  • 具體工廠 (BenzDriver/BMWDriver):實現工廠方法,返回具體產品
  • 抽象產品 (Car):同簡單工廠
  • 具體產品 (Benz/BMW):同簡單工廠

3.2 代碼實現

// 抽象工廠
public interface Driver {
    Car driveCar(); // 工廠方法
}

// 具體工廠:每個產品一個工廠類
public class BenzDriver implements Driver {
    public Car driveCar() { return new Benz(); }
}
public class BMWDriver implements Driver {
    public Car driveCar() { return new BMW(); }
}

// 客戶端:依賴抽象工廠
public class Magnate {
    public static void main(String[] args) {
        Driver driver = new BenzDriver(); // 選擇具體工廠
        Car car = driver.driveCar();      // 調用工廠方法
        car.drive();
    }
}

3.3 核心優勢

  • 完全符合開閉原則:新增產品只需添加具體工廠+具體產品,零修改現有代碼
  • 單一職責:每個工廠類只負責一個產品創建
  • 多態性:客戶端面向抽象工廠編程,支持運行時動態切換

3.4 實戰優化:簡單工廠 + 工廠方法混合

當產品過多導致工廠類爆炸時,可對「同類產品」使用簡單工廠:

// 豪華車工廠 (簡單工廠內部封裝)
public class LuxuryCarDriver implements Driver {
    public Car driveCar(String model) {
        if ("Benz".equals(model)) return new Benz();
        if ("BMW".equals(model)) return new BMW();
        if ("Audi".equals(model)) return new Audi();
        throw new IllegalArgumentException();
    }
}

// 經濟車工廠
public class EconomyCarDriver implements Driver { ... }

四、抽象工廠模式 (Abstract Factory) - 「產品族創建」

4.1 核心概念:產品等級 vs 產品族

產品等級結構 (垂直):
汽車 → 轎車/SUV/跑車
引擎 → 燃油/電動/混動

產品族 (橫向,功能相關):
奔馳家族:奔馳轎車 + 奔馳引擎 + 奔馳變速箱
寶馬家族:寶馬轎車 + 寶馬引擎 + 寶馬變速箱

4.2 適用條件 (必須同時滿足)

  1. 系統有 多個產品族,但一次只消費 其中一族
  2. 同族產品 協同使用,跨族產品不能混用

4.3 角色結構

  • 抽象工廠:聲明多個工廠方法,每個對應一個產品等級
  • 具體工廠:實現所有工廠方法,創建某族所有產品
  • 多個抽象產品:每個產品等級一個接口
  • 多個具體產品:每個族×等級一個實現類

4.4 代碼骨架

// 抽象產品等級
interface Car { void drive(); }
interface Engine { void start(); }

// 抽象工廠:聲明創建所有等級產品的方法
interface CarFactory {
    Car createCar();
    Engine createEngine();
}

// 具體工廠:奔馳家族
class BenzFactory implements CarFactory {
    public Car createCar() { return new BenzCar(); }
    public Engine createEngine() { return new BenzEngine(); }
}

// 具體工廠:寶馬家族
class BMWFactory implements CarFactory {
    public Car createCar() { return new BMWCar(); }
    public Engine createEngine() { return new BMWEninge(); }
}

// 客戶端:綁定某族工廠
class Client {
    private CarFactory factory;
    public Client(CarFactory factory) { this.factory = factory; }
    
    public void produce() {
        Car car = factory.createCar();
        Engine engine = factory.createEngine();
        // 組裝...
    }
}

五、三大模式對比總結

維度簡單工廠工廠方法抽象工廠
工廠類數量1N (每產品一個)M (每族一個)
產品等級11多
產品族11多
開閉原則工廠類違反完全符合完全符合
客戶端依賴具體工廠類抽象工廠接口抽象工廠接口
擴展方式修改工廠判斷邏輯新增工廠+產品類新增工廠+全族產品類
典型應用JDBC DriverManager、Calendar.getInstance()集合迭代器、文檔解析器UI皮膚、數據庫適配器、跨平台GUI

六、實戰選型決策樹

開始
  │
  ├─ 只有一種產品,種類固定少? → 簡單工廠
  │
  ├─ 一種產品,但種類頻繁擴展? → 工廠方法
  │
  ├─ 多種相關產品(族),需協同使用? → 抽象工廠
  │
  └─ 以上都不滿足? → 考慮 Builder/Prototype/依賴注入

七、現代視角:Spring 中的工廠模式

  • BeanFactory/ApplicationContext:核心容器即抽象工廠,getBean() 是工廠方法
  • FactoryBean 接口:工廠方法模式,getObject() 延遲創建複雜 Bean
  • @Bean 方法:簡單工廠,配置類中集中創建邏輯
  • @Conditional:運行時動態決定實現,本質是簡單工廠判斷邏輯

八、總結

三大工廠模式由簡入繁,核心演進路線:集中判斷 → 延遲到子類 → 族級創建。選型原則:滿足當前需求的最簡單模式。簡單工廠適合穩定少變場景;工廠方法是最常用、平衡靈活與複雜度;抽象工廠解決多產品族協同問題。現代框架 (Spring/Guice) 通過依賴注入已內化工廠邏輯,業務代碼多直接聲明依賴,手寫工廠類場景大幅減少,但理解其原理對閱讀框架源碼、設計擴展點至關重要。

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