概念
定義一個創建對象的接口,但讓子類決定實例化哪個類。
實現示例
#include <iostream> #include <memory>// 產品基類 class Product { public:virtual void use() = 0;virtual ~Product() = default; };// 具體產品A class ConcreteProductA : public Product { public:void use() override {std::cout << "Using Product A" << std::endl;} };// 具體產品B class ConcreteProductB : public Product { public:void use() override {std::cout << "Using Product B" << std::endl;} };// 工廠基類 class Factory { public:virtual std::unique_ptr<Product> createProduct() = 0;virtual ~Factory() = default; };// 具體工廠A class ConcreteFactoryA : public Factory { public:std::unique_ptr<Product> createProduct() override {return std::make_unique<ConcreteProductA>();} };// 具體工廠B class ConcreteFactoryB : public Factory { public:std::unique_ptr<Product> createProduct() override {return std::make_unique<ConcreteProductB>();} };// 使用示例 int main() {std::unique_ptr<Factory> factoryA = std::make_unique<ConcreteFactoryA>();auto productA = factoryA->createProduct();productA->use(); // Using Product Astd::unique_ptr<Factory> factoryB = std::make_unique<ConcreteFactoryB>();auto productB = factoryB->createProduct();productB->use(); // Using Product Breturn 0; }
UML結構圖
?
優缺點
優點:符合開閉原則,擴展性好
缺點:每增加一個產品就要增加一個工廠類
要點總結??
1、FactoryMethod模式用于隔離類對象的使用者和具體類型之間的耦合關系。面對一個經常變化的具體類型,緊耦合關系(new)會導致軟件的脆弱。
2、FactoryMethod模式通過面向對象的手法,將所要創建的具體對象工作延遲到子類,從而實現一種擴展(而非更改)的策略,較好地解決了這種緊耦合關系。
3、FactoryMethod模式解決“單個對象”的需求變化。缺點在于要求創建方法/參數相同。