意圖:提供一個創建一系列相關或相互依賴對象的介面,無需指定其具體類。
主要解決:介面選擇問題,系統產品存在多個產品族,但只消費其中某一族。

// 抽象產品
interface Shirt { /* ... */ }
interface Trousers { /* ... */ }
// 具體產品族:商務裝
class BusinessShirt implements Shirt { /* ... */ }
class BusinessTrousers implements Trousers { /* ... */ }
// 具體產品族:時尚裝
class FashionShirt implements Shirt { /* ... */ }
class FashionTrousers implements Trousers { /* ... */ }
// 抽象工廠
interface ClothingFactory {
Shirt createShirt();
Trousers createTrousers();
}
// 具體工廠
class BusinessFactory implements ClothingFactory {
public Shirt createShirt() { return new BusinessShirt(); }
public Trousers createTrousers() { return new BusinessTrousers(); }
}
class FashionFactory implements ClothingFactory {
public Shirt createShirt() { return new FashionShirt(); }
public Trousers createTrousers() { return new FashionTrousers(); }
}
一個衣櫃(具體工廠)只存放一套成套衣服(產品族):商務男裝、商務女裝、時尚男裝、時尚女裝。每套包含上衣(抽象產品)和褲子(另一抽象產品)。客戶端只需從特定衣櫃取出整套,保證風格一致。
| 優點 | 缺點 |
|---|---|
| 保證客戶端始終使用同一產品族對象 | 產品族擴展困難:新增產品需修改抽象工廠及所有具體工廠 |
| 將產品族創建邏輯封裝在工廠中 | 增加新產品等級(如加領帶)相對容易 |
產品族難擴展,產品等級易擴展。設計時需權衡變化維度。