概念

  • 定义一个创建对象的接口,但让子类决定实例化哪个类。

    实现示例

    #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模式解决“单个对象”的需求变化。缺点在于要求创建方法/参数相同。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐