定義 抽象工廠模式是一種創建型設計模式,它提供一個介面,用於創建一系列相關或依賴的對象,而無需指定它們的具體類。抽象工廠模式將對象的創建過程抽象化,允許子類通過實現具體工廠類來定製對象的創建。 為什麼使用抽象工廠模式 產品族的一致性 抽象工廠模式確保同一產品族中的對象之間的一致性。 部分遵循開閉原則 ...
定義
抽象工廠模式是一種創建型設計模式,它提供一個介面,用於創建一系列相關或依賴的對象,而無需指定它們的具體類。抽象工廠模式將對象的創建過程抽象化,允許子類通過實現具體工廠類來定製對象的創建。為什麼使用抽象工廠模式
-
產品族的一致性
- 抽象工廠模式確保同一產品族中的對象之間的一致性。
-
部分遵循開閉原則
- 可以通過添加新的具體工廠類來擴展新的產品族,而不需要修改現有代碼,符合開閉原則。
- 增加新的產品類型時,需要修改抽象工廠介面及其所有具體實現,不完全符合開閉原則。
-
隱藏對象創建細節
- 抽象工廠模式將具體產品的創建過程隱藏起來,客戶端只需要使用工廠提供的介面來獲取對象。
實現步驟
-
定義抽象產品類
- 定義所有具體產品類的共同介面,客戶端將通過這個介面來使用具體產品。
-
實現具體產品類
- 實現產品介面的具體產品類,這些類包含了產品的實際業務邏輯。
-
定義抽象工廠類
- 定義一個抽象工廠類,包含用於創建一系列相關或依賴對象的抽象方法,子類將實現這些方法來創建具體產品對象。
-
實現具體工廠類
- 繼承抽象工廠類並實現其抽象方法,具體工廠類負責創建具體產品對象。
優缺點和適用場景
優點
-
產品族的一致性
- 確保同一產品族中的對象之間的一致性。
-
部分符合開閉原則
- 可以通過添加新的具體工廠類來擴展新的產品族,符合開閉原則。
-
隱藏對象創建細節
- 客戶端無需知道具體產品的創建過程,只需要通過工廠介面獲取對象。
缺點
-
增加系統複雜性
- 引入了更多的類,增加了系統的複雜性。
-
不完全符合開閉原則
- 增加新的產品類型時,需要修改抽象工廠介面及其所有具體實現,不完全符合開閉原則。
適用場景
-
系統需要創建一系列相關或依賴的對象
- 當系統需要創建一系列相關或依賴的對象,並且確保這些對象之間的一致性時,適合使用抽象工廠模式。
-
產品族擴展
- 當系統需要通過增加新的產品族來擴展功能,而不需要修改現有代碼時,適合使用抽象工廠模式。
簡單工廠模式、工廠方法模式與抽象工廠模式的比較
特性 | 簡單工廠模式 | 工廠方法模式 | 抽象工廠模式 |
創建對象的職責 | 單一工廠類負責所有產品創建 | 子類決定創建具體對象 | 子類決定創建一系列相關對象 |
遵循開閉原則 | 不符合,增加新產品需修改工廠類 | 符合,增加新產品無需修改工廠類 | 部分符合,增加產品族符合 |
系統複雜性 | 較低 | 中等 | 較高 |
產品族一致性支持 | 不支持 | 不支持 | 支持 |
咖啡店的例子
我們可以使用抽象工廠模式來實現一個咖啡店系統,該系統可以創建不同種類的咖啡及其配套的杯子和勺子。#include <iostream> #include <memory> #include <string> // 抽象產品類:咖啡 class Coffee { public: virtual ~Coffee() {} virtual std::string getDescription() const = 0; virtual double cost() const = 0; }; // 具體產品類:美式咖啡 class Americano : public Coffee { public: std::string getDescription() const override { return "Americano"; } double cost() const override { return 5.0; } }; // 抽象產品類:咖啡杯 class CoffeeCup { public: virtual ~CoffeeCup() {} virtual std::string getDescription() const = 0; }; // 具體產品類:美式咖啡杯 class AmericanoCup : public CoffeeCup { public: std::string getDescription() const override { return "Americano Cup"; } }; // 抽象產品類:咖啡勺 class CoffeeSpoon { public: virtual ~CoffeeSpoon() {} virtual std::string getDescription() const = 0; }; // 具體產品類:美式咖啡勺 class AmericanoSpoon : public CoffeeSpoon { public: std::string getDescription() const override { return "Americano Spoon"; } }; // 抽象工廠類 class CoffeeFactory { public: virtual ~CoffeeFactory() {} virtual std::shared_ptr<Coffee> createCoffee() const = 0; virtual std::shared_ptr<CoffeeCup> createCoffeeCup() const = 0; virtual std::shared_ptr<CoffeeSpoon> createCoffeeSpoon() const = 0; }; // 具體工廠類:美式咖啡工廠 class AmericanoFactory : public CoffeeFactory { public: std::shared_ptr<Coffee> createCoffee() const override { return std::make_shared<Americano>(); } std::shared_ptr<CoffeeCup> createCoffeeCup() const override { return std::make_shared<AmericanoCup>(); } std::shared_ptr<CoffeeSpoon> createCoffeeSpoon() const override { return std::make_shared<AmericanoSpoon>(); } }; int main() { // 創建美式咖啡及其配套杯子和勺子 std::shared_ptr<CoffeeFactory> americanoFactory = std::make_shared<AmericanoFactory>(); std::shared_ptr<Coffee> americano = americanoFactory->createCoffee(); std::shared_ptr<CoffeeCup> americanoCup = americanoFactory->createCoffeeCup(); std::shared_ptr<CoffeeSpoon> americanoSpoon = americanoFactory->createCoffeeSpoon(); std::cout << "Coffee: " << americano->getDescription() << ", Cost: " << americano->cost() << std::endl; std::cout << "Cup: " << americanoCup->getDescription() << std::endl; std::cout << "Spoon: " << americanoSpoon->getDescription() << std::endl; return 0; }