cover

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

使用情境

  1. 跨區域產品:US/EU 產品組合。
  2. UI 主題:同一風格的元件組合。
  3. 資料庫抽象:連線/命令/讀取器組合。

實作範例

Abstract Factory 模式:不同工廠產出一致風格的產品家族

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());

優點

  • 產品相容性高
  • 客戶端與具體類解耦

缺點

  • 新增產品類型時需修改工廠介面

延伸閱讀