概念
-
定义一个创建对象的接口,但让子类决定实例化哪个类。
实现示例
#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 A std::unique_ptr<Factory> factoryB = std::make_unique<ConcreteFactoryB>(); auto productB = factoryB->createProduct(); productB->use(); // Using Product B return 0; }
UML结构图
-
优缺点
-
优点:符合开闭原则,扩展性好
-
缺点:每增加一个产品就要增加一个工厂类
要点总结
1、FactoryMethod模式用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系(new)会导致软件的脆弱。
2、FactoryMethod模式通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从而实现一种扩展(而非更改)的策略,较好地解决了这种紧耦合关系。
3、FactoryMethod模式解决“单个对象”的需求变化。缺点在于要求创建方法/参数相同。