定義 簡單工廠模式(Simple Factory Pattern)是一種創建型設計模式,它定義一個用於創建對象的介面,但由一個單獨的類來實現實際創建的工作。簡單工廠模式通過在一個類中集中管理對象的創建過程,可以減少客戶端與具體類之間的耦合,使得代碼結構更加清晰和易於維護。通過專門定義一個類來負責創建 ...
定義
簡單工廠模式(Simple Factory Pattern)是一種創建型設計模式,它定義一個用於創建對象的介面,但由一個單獨的類來實現實際創建的工作。簡單工廠模式通過在一個類中集中管理對象的創建過程,可以減少客戶端與具體類之間的耦合,使得代碼結構更加清晰和易於維護。通過專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類。為什麼使用簡單工廠模式?
- 統一管理對象創建:
- 簡單工廠模式將對象的創建邏輯集中到一個工廠類中,客戶端不需要知道具體的創建細節,只需調用工廠類提供的方法即可獲得所需的對象,減少了客戶端對類創建過程的依賴。
- 減少耦合:
- 客戶端與具體類之間的依賴被轉移到了工廠類,客戶端不再直接依賴具體類,從而降低了系統的耦合度。
- 更好的維護性:
- 當需要更改對象的創建邏輯或引入新的對象類型時,只需修改工廠類,而不需要修改客戶端代碼,提高了系統的可維護性。
實現步驟
-
定義抽象產品類
- 定義所有具體產品類的共同介面,客戶端將通過這個介面來使用具體產品。
-
實現具體產品類
- 實現產品介面的具體產品類,這些類包含了產品的實際業務邏輯。
-
定義工廠類
- 定義一個工廠類,包含一個用於創建產品對象的靜態方法,根據不同的參數來實例化不同的具體產品類,並返回產品介面類型的對象。
優缺點和適用場景
優點
-
統一管理對象創建
- 將對象創建邏輯集中管理,使代碼更加清晰易懂。
-
減少客戶端與具體類的耦合
- 客戶端只需依賴於產品介面和工廠類,不再直接依賴具體產品類。
-
便於擴展和維護
- 添加新產品類時,只需修改工廠類,客戶端代碼無需變動。
缺點
-
工廠類的職責過重
- 工廠類集中了所有產品對象的創建邏輯,可能導致代碼過於複雜,不利於擴展。
-
不符合開閉原則
- 添加新產品時需要修改工廠類的代碼,違背了開閉原則。
適用場景
-
對象創建邏輯複雜
- 當對象的創建過程較為複雜時,可以使用簡單工廠模式將創建邏輯集中管理,簡化客戶端代碼。
-
客戶端不需要關心對象的創建細節
- 當客戶端不需要知道對象的創建過程,只需使用對象時,可以使用簡單工廠模式隱藏創建細節。
咖啡店的例子
假設我們有一個咖啡店,根據客戶的需求生產不同類型的咖啡。我們可以使用簡單工廠模式來實現咖啡的創建。#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 Latte : public Coffee { public: std::string getDescription() const override { return "Latte"; } double cost() const override { return 6.0; } }; // 簡單工廠類 class CoffeeFactory { public: enum CoffeeType { AMERICANO, LATTE }; static std::shared_ptr<Coffee> createCoffee(CoffeeType type) { switch (type) { case AMERICANO: return std::make_shared<Americano>(); case LATTE: return std::make_shared<Latte>(); default: return nullptr; } } }; int main() { // 創建美式咖啡 std::shared_ptr<Coffee> americano = CoffeeFactory::createCoffee(CoffeeFactory::AMERICANO); std::cout << "Description: " << americano->getDescription() << ", Cost: " << americano->cost() << " RMB" << std::endl; // 創建拿鐵咖啡 std::shared_ptr<Coffee> latte = CoffeeFactory::createCoffee(CoffeeFactory::LATTE); std::cout << "Description: " << latte->getDescription() << ", Cost: " << latte->cost() << " RMB" << std::endl; return 0; }