# 工廠方法模式 教學 : https://blog.csdn.net/zengchenAAA/article/details/137938449 補充:可把code簡單分成API跟客戶端。API提供interface供客戶端使用。客戶端只需要知到interface怎麼用,不需要知道實作(這個interface的內容以及他的子類)。 用interface和多態,客戶端只需要知道且只會使用interface的子類override的那些純虛函數 ## 懶人包 跟簡單工廠模式幾乎一樣,只是工廠也變成抽象工廠和具體工廠 符合開閉原則 ## 懶人包 抽象工廠 = interface,提供一個public純虛函數用於產生產品(object)。 具體工廠 = 抽象工廠的子類 注意此函數return的是指向抽象產品的指標,只有這樣return才可以在同一個函數return不同具體產品的物件。 工廠方法模式中,有一個抽象工廠和多個具體工廠,每個具體工廠負責生產自己的產品 抽象產品 = interface = 一定要有純虛函數 具體產品 = 抽象產品的子類 ## 實作流程 1. 寫抽象產品class(一定要有純虛函數)、具體產品class(繼承自抽象產品) 2. 寫抽象工廠class(一定要有純虛函數,就是生產產品的那個函數)、具體工廠class(繼承自抽象工廠) 3. main() : 1. 根據你要生產哪個具體產品去生成對應的具體工廠 2. 用此具體工廠生成具體產品 3. 使用具體產品 4. delete生成的具體產品和具體工廠 :::spoiler code ```cpp= #include <iostream> // 用enum限制createProduct()的參數是比較好的做法,可避免輸入invalid的參數導致return nullptr enum ProductType { //改用enum class ProductType 較安全 A, B }; class Product { public: virtual void operation() const = 0; //如果有destructor,記得宣告virtual }; class ConcreteProductA : public Product { public: void operation() const override { std::cout << "ConcreteProductA operation\n"; } }; class ConcreteProductB : public Product { public: void operation() const override { std::cout << "ConcreteProductB operation\n"; } }; class Factory { public: virtual Product* createProduct() = 0; }; class ConcreteFactoryA : public Factory { public: Product* createProduct() override { return new ConcreteProductA(); } }; class ConcreteFactoryB : public Factory { public: Product* createProduct() override { return new ConcreteProductB(); } }; int main() { //生產具體產品A Factory* factoryA = new ConcreteFactoryA(); Product* productA = factoryA->createProduct(); productA->operation(); delete productA; delete factoryA; //生產具體產品B Factory* factoryB = new ConcreteFactoryB(); Product* productB = factoryB->createProduct(); productB->operation(); delete productB; delete factoryB; return 0; } ``` :::