
Abstract Factory 模式:確保產品相容
Abstract Factory 模式提供一個介面來建立一組相關的產品,確保它們彼此相容。
classDiagram class AbstractFactory { <<abstract>> +createProductA()* ProductA +createProductB()* ProductB } class USFactory { +createProductA() USProductA +createProductB() USProductB } class ProductA { <<abstract>> +use()* String } class ProductB { <<abstract>> +use()* String } class USProductA { +use() String } class USProductB { +use() String } AbstractFactory <|-- USFactory ProductA <|-- USProductA ProductB <|-- USProductB USFactory ..> USProductA : creates USFactory ..> USProductB : creates
使用情境
- 跨區域產品:US/EU 產品組合。
- UI 主題:同一風格的元件組合。
- 資料庫抽象:連線/命令/讀取器組合。
實作範例

class AbstractFactory {
async createProductA() {
throw new Error('createProductA must be implemented');
}
async createProductB() {
throw new Error('createProductB must be implemented');
}
}
class ProductA {
use() {
throw new Error('use must be implemented');
}
}
class ProductB {
use() {
throw new Error('use must be implemented');
}
}
class USProductA extends ProductA {
use() {
return 'US Product A';
}
}
class USProductB extends ProductB {
use() {
return 'US Product B';
}
}
class USFactory extends AbstractFactory {
async createProductA() {
return new USProductA();
}
async createProductB() {
return new USProductB();
}
}
async function clientCode(factory) {
const productA = await factory.createProductA();
const productB = await factory.createProductB();
console.log(productA.use());
console.log(productB.use());
}
clientCode(new USFactory());優點
- 產品相容性高
- 客戶端與具體類解耦
缺點
- 新增產品類型時需修改工廠介面