大话设计模式之抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种方式来创建一系列相关或依赖对象的家族,而无需指定其具体类。该模式通过提供一个抽象工厂接口,定义了一组可以创建不同类型对象的方法,具体的工厂类实现了这些方法以创建具体的对象。

cpp 复制代码
#include <iostream>
#include <memory>

// 抽象产品A接口
class AbstractProductA {
public:
    virtual void use() = 0;
};

// 具体产品A1类
class ProductA1 : public AbstractProductA {
public:
    void use() override {
        std::cout << "Product A1 in use" << std::endl;
    }
};

// 具体产品A2类
class ProductA2 : public AbstractProductA {
public:
    void use() override {
        std::cout << "Product A2 in use" << std::endl;
    }
};

// 抽象产品B接口
class AbstractProductB {
public:
    virtual void eat() = 0;
};

// 具体产品B1类
class ProductB1 : public AbstractProductB {
public:
    void eat() override {
        std::cout << "Product B1 is eaten" << std::endl;
    }
};

// 具体产品B2类
class ProductB2 : public AbstractProductB {
public:
    void eat() override {
        std::cout << "Product B2 is eaten" << std::endl;
    }
};

// 抽象工厂接口
class AbstractFactory {
public:
    virtual std::shared_ptr<AbstractProductA> createProductA() = 0;
    virtual std::shared_ptr<AbstractProductB> createProductB() = 0;
};

// 具体工厂1类
class ConcreteFactory1 : public AbstractFactory {
public:
    std::shared_ptr<AbstractProductA> createProductA() override {
        return std::make_shared<ProductA1>();
    }

    std::shared_ptr<AbstractProductB> createProductB() override {
        return std::make_shared<ProductB1>();
    }
};

// 具体工厂2类
class ConcreteFactory2 : public AbstractFactory {
public:
    std::shared_ptr<AbstractProductA> createProductA() override {
        return std::make_shared<ProductA2>();
    }

    std::shared_ptr<AbstractProductB> createProductB() override {
        return std::make_shared<ProductB2>();
    }
};

int main() {
    // 创建具体工厂1对象
    std::shared_ptr<AbstractFactory> factory1 = std::make_shared<ConcreteFactory1>();

    // 使用工厂1创建产品A和产品B
    std::shared_ptr<AbstractProductA> productA1 = factory1->createProductA();
    std::shared_ptr<AbstractProductB> productB1 = factory1->createProductB();

    // 测试产品A1和产品B1
    productA1->use();
    productB1->eat();

    // 创建具体工厂2对象
    std::shared_ptr<AbstractFactory> factory2 = std::make_shared<ConcreteFactory2>();

    // 使用工厂2创建产品A和产品B
    std::shared_ptr<AbstractProductA> productA2 = factory2->createProductA();
    std::shared_ptr<AbstractProductB> productB2 = factory2->createProductB();

    // 测试产品A2和产品B2
    productA2->use();
    productB2->eat();

    return 0;
}

/*
在这个示例中,我们首先定义了两个抽象产品类 AbstractProductA 和 AbstractProductB,
它们分别有不同的具体实现类 ProductA1、ProductA2、ProductB1 和 ProductB2。
然后定义了一个抽象工厂类 AbstractFactory,包含了创建产品A和产品B的纯虚函数。
接着,我们创建了两个具体工厂类 ConcreteFactory1 和 ConcreteFactory2,
分别实现了抽象工厂类中的创建方法,用于创建具体的产品对象。

在 main 函数中,我们先创建了具体工厂1对象,然后使用该工厂对象分别创建了产品A1和产品B1,
并对其进行了测试。接着,创建了具体工厂2对象,使用工厂2创建了产品A2和产品B2,并测试了其功能。

通过抽象工厂模式,我们可以将产品的创建和使用分离,使得系统更易于扩展和维护。
同时,该模式也符合开闭原则,因为增加新的产品类型只需要添加新的具体产品类和对应的具体工厂类,
而无需修改现有的代码。

*/

觉得有帮助的话,打赏一下呗。。

相关推荐
神仙别闹8 分钟前
基于MFC实现的赛车游戏
c++·游戏·mfc
编程、小哥哥11 分钟前
设计模式之抽象工厂模式(替换Redis双集群升级,代理类抽象场景)
redis·设计模式·抽象工厂模式
小c君tt15 分钟前
MFC中 error C2440错误分析及解决方法
c++·mfc
木向1 小时前
leetcode92:反转链表||
数据结构·c++·算法·leetcode·链表
阿阿越1 小时前
算法每日练 -- 双指针篇(持续更新中)
数据结构·c++·算法
hunandede1 小时前
FFmpeg存放压缩后的音视频数据的结构体:AVPacket简介,结构体,函数
c++
hunandede2 小时前
FFmpeg 4.3 音视频-多路H265监控录放C++开发十三:将AVFrame转换成AVPacket。视频编码,AVPacket 重要函数,结构体成员学习
c++·ffmpeg·音视频
奋斗的小花生7 小时前
c++ 多态性
开发语言·c++
闲晨8 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
UestcXiye9 小时前
《TCP/IP网络编程》学习笔记 | Chapter 3:地址族与数据序列
c++·计算机网络·ip·tcp