又稱靜態工廠方法模式,由一個工廠類根據傳入參數決定建立哪種產品實例。屬於創建型模式,但不屬於 GoF 23 種經典模式。
// 產品介面
public interface Calculator { double calculate(double a, double b); }
// 具體產品
public class AddCalculator implements Calculator { public double calculate(double a, double b) { return a + b; } }
public class SubCalculator implements Calculator { public double calculate(double a, double b) { return a - b; } }
// 簡單工廠
public class CalculatorFactory {
public static Calculator create(String operator) {
switch (operator) {
case "+": return new AddCalculator();
case "-": return new SubCalculator();
// ...
default: throw new IllegalArgumentException("不支援的運算符:" + operator);
}
}
}
public class CalculatorMultiFactory {
public static Calculator createAdd() { return new AddCalculator(); }
public static Calculator createSub() { return new SubCalculator(); }
// ...
}
優點:編譯期類型安全,IDE 友好。缺點:新增產品需修改工廠類,違反開閉原則。
提供一個介面,用於建立「相關或依賴物件的家族」,而無需指定具體類別。核心角色:
// 抽象產品
interface Button { void render(); }
interface TextField { void render(); }
// 具體產品:Windows 風格
class WinButton implements Button { public void render() { System.out.println("渲染 Windows 按鈕"); } }
class WinTextField implements TextField { public void render() { System.out.println("渲染 Windows 輸入框"); } }
// 具體產品:Mac 風格
class MacButton implements Button { public void render() { System.out.println("渲染 Mac 按鈕"); } }
class MacTextField implements TextField { public void render() { System.out.println("渲染 Mac 輸入框"); } }
// 抽象工廠
interface GUIFactory {
Button createButton();
TextField createTextField();
}
// 具體工廠
class WinFactory implements GUIFactory {
public Button createButton() { return new WinButton(); }
public TextField createTextField() { return new WinTextField(); }
}
class MacFactory implements GUIFactory {
public Button createButton() { return new MacButton(); }
public TextField createTextField() { return new MacTextField(); }
}
// 客戶端
public class Application {
private final Button button;
private final TextField textField;
public Application(GUIFactory factory) {
button = factory.createButton();
textField = factory.createTextField();
}
public void renderUI() { button.render(); textField.render(); }
}
| 維度 | 簡單工廠 | 抽象工廠 |
|---|---|---|
| 適用場景 | 產品種類少、固定、邏輯簡單 | 產品族多、需跨平台/主題切換、產品間有協作關係 |
| 擴充性 | 新增產品需修改工廠(違反開閉原則) | 新增產品族只需新增具體工廠,符合開閉原則 |
| 複雜度 | 低 | 高 |
| 耦合度 | 客戶端耦合具體工廠類 | 客戶端僅依賴抽象工廠介面 |
簡單工廠適合輕量級場景,抽象工廠適合構建可擴充的產品族體系。實務中常搭配依賴注入框架(如 Spring)管理工廠實例,進一步解耦。