【C++设计模式】创建型模式—工厂模式

目录

工厂模式

工厂模式的主要优势

工厂模式的几种常见变体

解析示例代码


工厂模式

工厂模式(Factory Pattern)是一种创建型设计模式,旨在提供一种统一的方式来创建对象,而无需指定其具体类。它通过提供一个共同的接口来创建对象,这个接口的具体实现可以根据不同的需求返回不同类的对象实例。

工厂模式的主要优势

  1. 封装对象创建逻辑:工厂模式将对象的实例化过程集中在一个位置,客户端代码不需要直接实例化对象,从而降低了耦合度。

  2. 简化对象替换:由于客户端代码仅依赖于工厂接口,如果需要更改创建的具体类,只需调整工厂的实现,而不需要修改客户端代码。

  3. 支持多态性:工厂方法通常会定义为虚函数,这样在子类中可以根据需要重写工厂方法,返回不同的对象实例,从而实现多态。

工厂模式的几种常见变体

  1. 简单工厂模式(Simple Factory Pattern)

    • 定义一个工厂类,通过静态方法根据传入的参数创建不同的产品实例。这种模式不属于23种经典设计模式,但常被用来学习工厂模式的基本概念。
  2. 工厂方法模式(Factory Method Pattern)

    • 将工厂抽象成一个接口或抽象类,由子类决定实例化哪个具体产品类。每个具体工厂类对应创建一个具体产品类的实例,从而支持更灵活的对象创建过程。
  3. 抽象工厂模式(Abstract Factory Pattern)

    • 提供一个接口用于创建相关或依赖对象的家族,而不需要明确指定具体类。它利用工厂方法来创建不同但相关的产品,使得易于交换产品系列。
#include <iostream>
#include <memory>

// 抽象产品类
class Product {
public:
    virtual void operation() = 0;
    virtual ~Product() {}
};

// 具体产品A
class ConcreteProductA : public Product {
public:
    void operation() override {
        std::cout << "ConcreteProductA" << std::endl;
    }
};

// 具体产品B
class ConcreteProductB : public Product {
    void operation() override {
        std::cout << "ConcreteProductB" << std::endl;
    }
};

// 工厂类
class Factory {
public:
    virtual std::unique_ptr<Product> createProduct() = 0;
    virtual ~Factory() {}
};

// 具体工厂类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()
{
    // 使用具体工厂类A创建具体产品类A的实例
    std::unique_ptr<Factory> factoryA = std::make_unique<ConcreteFactoryA>();
    std::unique_ptr<Product> productA = factoryA->createProduct();
    productA->operation();

    // 使用具体工厂类B创建具体产品类B的实例
    std::unique_ptr<Factory> factoryB = std::make_unique<ConcreteFactoryB>();
    std::unique_ptr<Product> productB = factoryB->createProduct();
    productB->operation();
    return 0;
}

解析示例代码

  1. 产品类和具体产品类

    • Product 是一个抽象基类,定义了产品对象的接口。
    • ConcreteProductA 和 ConcreteProductB 是具体产品类,实现了 Product 的接口,提供了具体的操作实现。
  2. 工厂类和具体工厂类

    • Factory 是一个抽象基类,声明了工厂方法 createProduct(),返回 Product 类型的指针。
    • ConcreteFactoryA 和 ConcreteFactoryB 是具体工厂类,分别实现了工厂方法 createProduct(),返回 ConcreteProductA 和 ConcreteProductB 的实例。
  3. 客户端代码

    • 在 main() 函数中,首先使用具体工厂类 A 创建 ConcreteProductA 的实例,然后调用 operation() 方法执行操作。
    • 使用具体工厂类 B 创建 ConcreteProductB 的实例,同样调用 operation() 方法执行操作。
  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式职场

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值