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

抽象工厂模式(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,并测试了其功能。

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

*/

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

相关推荐
ytadpole1 小时前
揭秘设计模式:命令模式-告别混乱,打造优雅可扩展的代码
java·设计模式
骄傲的心别枯萎1 小时前
RV1126 NO.16:通过多线程同时获取H264和H265码流
linux·c++·音视频·rv1126
落羽的落羽1 小时前
【C++】特别的程序错误处理方式——异常机制
开发语言·c++
空山新雨(大队长)2 小时前
C 语言第一课:hello word c
c++·c·exe
春蕾夏荷_7282977252 小时前
c++ 第三方库与个人封装库
c++·三方库
牵牛老人2 小时前
Qt C++ 复杂界面处理:巧用覆盖层突破复杂界面处理难题之一
数据库·c++·qt
离越词3 小时前
C++day8作业
开发语言·c++·windows
MMjeaty3 小时前
deque容器
c++
CYRUS_STUDIO3 小时前
如何防止 so 文件被轻松逆向?精准控制符号导出 + JNI 动态注册
android·c++·安全
CYRUS_STUDIO3 小时前
C&C++ 代码安全再升级:用 OLLVM 给 so 加上字符串加密保护
c++·安全·llvm