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

深入理解 Java 三大工廠模式:簡單工廠、工廠方法與抽象工廠

     編輯:Java 相關知識

前言:為什麼需要工廠模式?

在物件導向設計中,new 關鍵字雖然是建立物件最直接的方式,但隨著系統複雜度提升,直接實例化具體類別會導致高耦合、難維護、難擴展。工廠模式透過封裝物件建立邏輯,為「創建者」與「使用者」之間引入一層間接關係,實現解耦。本文將系統梳理 Java 三大經典工廠模式:簡單工廠、工廠方法 與 抽象工廠,並透過代碼範例解析其適用場景與優缺點。

一、工廠模式的核心應用場景

根據《Java 與模式》歸納,工廠模式主要適用於以下情境:

  • 靜態實現選擇:需根據條件(如配置、參數)動態決定實例化哪個實現類(如不同品牌汽車、不同瀏覽器的 XHR 物件)。
  • 節省複雜初始化開銷:物件建立涉及大量相關配置(如載入外部庫、解析設定檔),工廠可集中處理一次性初始化,避免構造函數重複執行。
  • 組合複雜物件:將多個細粒度物件組裝成大物件(如自行車由車輪、車架、傳動系統組成),並支援運行時動態替換組件。

二、簡單工廠模式

結構角色

  1. 工廠角色:核心邏輯,包含判斷條件,返回具體產品(通常為 static 方法)。
  2. 抽象產品角色:介面或抽象類,定義產品公共契約。
  3. 具體產品角色:實際被實例化的類別。

代碼示例:汽車工廠

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

// 具體產品
public class Benz implements Car { public void drive() { System.out.println("Driving Benz"); } }
public class Bmw implements Car { public void drive() { System.out.println("Driving Bmw"); } }

// 簡單工廠
public class Driver {
    public static Car driverCar(String type) throws Exception {
        if ("Benz".equalsIgnoreCase(type)) return new Benz();
        else if ("Bmw".equalsIgnoreCase(type)) return new Bmw();
        else throw new Exception("不支援的車型");
    }
}

// 客戶端
public class Magnate {
    public static void main(String[] args) throws Exception {
        Car car = Driver.driverCar("Benz");
        car.drive();
    }
}

優缺點分析

  • ✅ 優點:客戶端解耦具體類,邏輯集中,簡單易懂。
  • ❌ 缺點:違反開閉原則。新增產品需修改工廠類判斷邏輯,易演變成「上帝類」;產品層級較深時維護困難。

適用場景:業務簡單、產品種類固定、擴展頻率低的場合。

三、工廠方法模式

結構角色

  1. 抽象工廠角色:定義創建產品的介面(如 Driver 介面)。
  2. 具體工廠角色:實現抽象工廠,負責實例化特定產品(如 BenzDriver、BmwDriver)。
  3. 抽象產品/具體產品:同上。

代碼示例:司機派工

// 抽象工廠
public interface Driver { Car driverCar(); }

// 具體工廠
public class BenzDriver implements Driver { public Car driverCar() { return new Benz(); } }
public class BmwDriver implements Driver { public Car driverCar() { return new Bmw(); } }

// 客戶端
public class Magnate {
    public static void main(String[] args) {
        Driver driver = new BenzDriver(); // 可動態注入
        Car car = driver.driverCar();
        car.drive();
    }
}

優缺點分析

  • ✅ 優點:完全符合開閉原則。新增產品只需新增對應工廠類,無需修改既有代碼。
  • ❌ 缺點:類別爆炸。每個產品需對應一個工廠類,系統類數量成倍增加。

改良建議:對於同層級的「兄弟產品」(如同品牌不同車系),可在具體工廠內部結合簡單工廠邏輯,減少類別數量。

四、抽象工廠模式

核心概念:產品族

位於不同產品等級結構中、功能相關聯的產品組成的家族。例如:
BenzSportsCar + BmwSportsCar = 跑車族
BenzBusinessCar + BmwBusinessCar = 商務車族

適用條件

  1. 系統存在多個產品族,但一次只消費其中一族。
  2. 同屬一族的產品需搭配使用。

角色結構

與工廠方法類似,但抽象工廠介面宣告多個創建方法,分別對應不同等級的產品(如 createSportsCar()、createBusinessCar())。具體工廠實現這組方法,確保產出的物件屬於同一族。

優缺點

  • ✅ 確保產品族內部一致性,隔離具體實現。
  • ❌ 擴展新產品等級(如新增「SUV」等級)極其困難,需修改抽象工廠介面及所有實現類。

五、總結與選型指南

模式抽象層次擴展性適用場景
簡單工廠低差(違反 OCP)產品固定、邏輯簡單、無頻繁擴展
工廠方法中良(符合 OCP)單一產品等級、需頻繁新增產品類型
抽象工廠高良(族內擴展)多產品等級、存在產品族、需保證族內一致性

最佳實踐:實際專案中常採用混合策略——頂層用抽象工廠定義產品族介面,具體工廠內部對同層級產品採用簡單工廠邏輯,兼顧擴展性與類別數量控制。

工廠模式的本質是將「變化」封裝起來。選型時請問自己:什麼在變?是產品種類?產品族?還是初始化邏輯?針對變化點選擇適當抽象層次,切勿過度設計。

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