工廠模式核心在於「將物件建立邏輯封裝」,依複雜度分為三層:簡單工廠(條件判斷建立)、工廠方法(多型委派子類別)、抽象工廠(產品族建立)。前兩者為核心必修,抽象工廠適用於多產品族場景。
依傳入參數決定建立何種物件。範例以單例包裝工廠,示範 int 與 String 兩種多載判斷:
public class SimpleFactory {
private static final SimpleFactory INSTANCE = new SimpleFactory();
private SimpleFactory() {}
public static SimpleFactory getInstance() { return INSTANCE; }
public void factory(int type) {
if (type == 1) System.out.println("KFC's chicken wing");
else if (type == 2) System.out.println("McDonald's chicken wing");
else System.out.println("no chicken wing");
}
public void factory(String type) { /* 字串判斷邏輯 */ }
}
進階應用:搭配配置檔(如 erp.cfg.properties)儲存實作類別全名,透過 Class.forName().newInstance() 動態載入,實現「修改配置即切換實作」的可維護性。
定義建立物件的介面,由子類別決定實例化哪個類別。範例以快餐店產出食物展示多型:
interface Store { Food makeFood(); }
class KFCStore implements Store {
public Food makeFood() { return new Food("KFC wing"); }
}
class McDonaldStore implements Store {
public Food makeFood() { return new Food("McDonald's hamburger"); }
}
class Food { String name; /* 建構子、getter/setter */ }
// 使用端
Store store = new KFCStore();
store.makeFood(); // 產出 KFC wing
// 新增必勝客只需新增類別實作 Store,不修改既有碼
class PizzaHut implements Store {
public Food makeFood() { return new Food("Pizza Hut pizza"); }
}
優勢:符合開放封閉原則,擴充新產品只需新增類別,無需修改客戶端代碼。
在工廠方法之上再包一層,用於建立「相關或相依物件的家族」。例如同時需要 FoodFactory(食物族)與 SoftFactory(軟體族),抽象工廠統一管理這些工廠的建立:
public abstract class AbstractFactory {
public abstract FoodFactory createFoodFactory();
public abstract SoftFactory createSoftFactory();
}
// 具體工廠實作略...
適用場景:系統有多個產品族,且一次只使用其中一族;產品族內部有相依關係需強制搭配使用。
| 模式 | 核心特徵 | 適用場景 | 擴充性 |
|---|---|---|---|
| 簡單工廠 | 集中式條件判斷 | 產品類別少、固定、客戶端不關心建立細節 | 低(修改工廠類別) |
| 工廠方法 | 多型委派子類別 | 產品類別多、頻繁新增、需解耦客戶端與具體類別 | 高(新增子類別) |
| 抽象工廠 | 建立產品族 | 多產品族、族內產品強相依、跨平台 UI 元件庫等 | 高(新增具體工廠) |