工廠模式是創建型模式中最基礎、應用最廣的模式之一。本文通過「手機生產」與「手機組件組裝」兩條主線,層層遞進講解 簡單工廠、工廠方法、抽象工廠 三種模式的結構、代碼實現、優缺點對比及選型指南。
一個工廠類根據傳入參數決定創建哪種具體產品。產品種類固定,新增產品必須修改工廠源碼,違反「開閉原則」。
// 產品接口
public interface Cellphone { void call(); }
// 具體產品
public class IPhone implements Cellphone { public void call() { System.out.println("iPhone 通話"); } }
public class Samsung implements Cellphone { public void call() { System.out.println("Samsung 通話"); } }
// 簡單工廠(靜態工廠方法)
public class SimplePhoneFactory {
public static Cellphone getCellphone(String type) {
if ("iPhone".equalsIgnoreCase(type)) return new IPhone();
else if ("Samsung".equalsIgnoreCase(type)) return new Samsung();
else throw new RuntimeException("不支援的手機類型: " + type);
}
}
// 客戶端
Cellphone phone = SimplePhoneFactory.getCellphone("iPhone");
phone.call();
定義一個創建對象的接口,由子類決定實例化哪個類。每個產品對應一個具體工廠,新增產品只需新增工廠類,符合開閉原則。
// 抽象工廠接口
public interface PhoneFactory {
Cellphone getPhone();
}
// 具體工廠
public class IPhoneFactory implements PhoneFactory {
public Cellphone getPhone() { return new IPhone(); }
}
public class SamsungFactory implements PhoneFactory {
public Cellphone getPhone() { return new Samsung(); }
}
// 新增小米只需加 MIPhoneFactory,無需動原有代碼
// 客戶端
PhoneFactory factory = new IPhoneFactory(); // 或通過配置/反射獲取
Cellphone phone = factory.getPhone();
針對產品族(多個相關/依賴的產品等級結構),提供一個接口創建一系列相關對象,無需指定具體類。解決「單一產品」模式無法解決的「組合型產品」創建問題。
// === 抽象產品 ====================================================
public interface CPU { void run(); void start(); }
public interface Camera { void take(); }
public interface Memory { void work(); }
// === 具體產品(高端/低端兩個產品族) =============================
class GoodCPU implements CPU { ... }
class BadCPU implements CPU { ... }
class GoodCamera implements Camera { ... }
class BadCamera implements Camera { ... }
class GoodMemory implements Memory { ... }
class BadMemory implements Memory { ... }
// === 抽象工廠 ====================================================
public interface AbPhoneFactory {
CPU getCPU();
Camera getCamera();
Memory getMemory();
}
// === 具體工廠(組裝產品族) ======================================
public class GoodPhoneFactory implements AbPhoneFactory {
public CPU getCPU() { return new GoodCPU(); }
public Camera getCamera() { return new GoodCamera(); }
public Memory getMemory() { return new GoodMemory(); }
}
public class BadPhoneFactory implements AbPhoneFactory {
public CPU getCPU() { return new BadCPU(); }
public Camera getCamera() { return new BadCamera(); }
public Memory getMemory() { return new BadMemory(); }
}
// 中端組合只需新增 MidPhoneFactory
// 客戶端
AbPhoneFactory factory = new GoodPhoneFactory(); // 高端旗艦機
CPU cpu = factory.getCPU();
Camera cam = factory.getCamera();
Memory mem = factory.getMemory();
// 組裝手機...
| 維度 | 簡單工廠 | 工廠方法 | 抽象工廠 |
|---|---|---|---|
| 解決問題 | 單一產品創建 | 單一產品創建(可擴展) | 產品族創建(多等級結構) |
| 結構複雜度 | ⭐ 低 | ⭐⭐ 中 | ⭐⭐⭐ 高 |
| 代碼複雜度 | 低 | 中 | 高 |
| 客戶端編程難度 | 低(只知參數) | 中(知具體工廠) | 中(知抽象工廠) |
| 管理難度 | 低(一個類) | 中(多工廠類) | 高(多產品+多工廠) |
| 開閉原則 | ❌ 違反 | ✅ 符合 | ✅ 符合(增加產品族) |
| 適用場景 | 產品少、固定、不常擴展 | 單一產品、頻繁擴展 | 多相關產品、需保證族內一致性 |
GitHub 完整項目:https://github.com/LiuJishuai/designPatterns
工廠模式三部曲體現了軟件設計從「簡單直接」到「解耦擴展」再到「族級協作」的演進邏輯。沒有銀彈,只有在具體業務場景下最合適的選擇。理解三者本質區別——創建什麼(單一 vs 族)、誰負責創建(集中 vs 分散)、如何擴展(修改 vs 新增),才能在實戰中游刃有餘。