设计模式六:工厂模式(Factory Pattern)

概念

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

    实现示例

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值