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

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

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

*/

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

相关推荐
小poop3 小时前
string 类从入门到深入
c++
眠りたいです3 小时前
现代C++:C++14中的新语言特性和库特性
c语言·开发语言·c++
浅念-5 小时前
LeetCode 回溯算法题——综合练习
数据结构·c++·算法·leetcode·职场和发展·深度优先·dfs
楼田莉子6 小时前
C++17新特性:__had_include/属性/求值顺序规则
开发语言·c++·后端
贵慜_Derek7 小时前
《从零实现 Agent 系统》连载 07|记忆系统:短期上下文 vs 长期外部记忆
人工智能·设计模式·架构
h_a_o777oah7 小时前
状态机+划分型 DP :深度解析K-划分问题下 DP 状态的转移逻辑(洛谷P2679 P2331 附C++代码)
c++·算法·动态规划·acm·状态机dp·划分型dp·滚动数组优化
雪度娃娃9 小时前
Asio异步读写——连接的安全回收问题
开发语言·c++·安全·php
不吃土豆的马铃薯9 小时前
Spdlog 进阶:日志基本控制、日志格式控制、异步记录器
linux·服务器·开发语言·前端·c++
liulilittle9 小时前
TCP UCP:基于卡尔曼滤波的BBR增强型拥塞控制算法
linux·网络·c++·tcp/ip·算法·c·通讯
咩咦10 小时前
C++学习笔记26:static 静态成员
c++·学习笔记·static·静态成员变量·静态成员·静态成员函数