三,设计模式-抽象工厂模式

目的

工厂模式 中,当需要创建新的产品时,则额外需要创建新的工厂,这种模式是对产品制造方法的抽象化,如果产品种类变多,则工厂数目变多,则代码规模会越来越大,且不同的产品类的生成依赖不同的工厂。为了解决上述问题,则提出了新的模式-抽象工厂模式。抽象工厂模式是对工厂的抽象化,即假设工厂不会只局限于生产一类产品,而是生产多系列产品。以汽车工厂为例,可能有多个品牌的汽车厂,每个汽车厂都可以/可能生产多种产品,如跑车、越野车等系列产品,那我们就有了下面的表格:

|-------|----|-----|----|
| | 轿车 | 越野车 | 卡车 |
| A品牌车厂 | A1 | A2 | A3 |
| B品牌车厂 | B1 | B2 | B3 |

A品牌车厂、B品牌车厂就类似一个个具体的生产工厂,轿车、越野车、卡车就是一系列的具体产品,抽象工厂不仅对产品进行抽象(统一接口),同时对工厂也进行抽象(统一接口,接口用来生产具体的系列产品)。

抽象工厂模式适用于如下场景:

  • 需要与多个不同系列的相关产品交互, 出于对未来扩展性的考虑, 不希望代码基于产品的具体类进行构建, 在这种情况下, 可以使用抽象工厂;抽象工厂提供了一个(或一套)接口, 可用于创建每个系列产品的对象。 只要代码通过该接口创建对象,就不会生成与应用程序已生成的产品类型不一致的产品;

实现

  1. 产品类型 (可能有多个,列)与产品体系/产品变体(产品类型数目一致,但产品类型实现方式不同,行)为维度绘制矩阵。

  2. 声明抽象产品接口(不同的产品类型的共同接口),让所有具体产品类实现这些接口。

  3. 声明抽象工厂接口(不同产品体系/产品变体的共同接口), 并在接口中为所有抽象产品提供一组构建方法。

  4. 为每种产品体系/产品变体实现一个具体工厂类。

  5. 修改应用程序的初始化代码,代码中根据应用程序配置或当前环境, 对特定具体工厂类进行初始化,并将该工厂对象传递给所有需要创建产品的类。

  6. 找出代码中所有对产品构造函数的直接调用, 将其替换为对工厂对象中相应构建方法的调用。

具体代码实现如下,这里以抽象工厂模式的应用场景UI为例:

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

class Button {
public:
    virtual void render() = 0;
    virtual ~Button() = default;
};

class Checkbox {
public:
    virtual void render() = 0;
    virtual ~Checkbox() = default;
};

class WindowsButton : public Button {
public:
    void render() override {
        std::cout << "Rendering Windows Button\n";
    }
};

class WindowsCheckbox : public Checkbox {
public:
    void render() override {
        std::cout << "Rendering Windows Checkbox\n";
    }
};

class MacButton : public Button {
public:
    void render() override {
        std::cout << "Rendering Mac Button\n";
    }
};

class MacCheckbox : public Checkbox {
public:
    void render() override {
        std::cout << "Rendering Mac Checkbox\n";
    }
};

class GUIFactory {
public:
    virtual std::unique_ptr<Button> createButton() = 0;
    virtual std::unique_ptr<Checkbox> createCheckbox() = 0;
    virtual ~GUIFactory() = default;
};

class WindowsFactory : public GUIFactory {
public:
    std::unique_ptr<Button> createButton() override {
        return std::make_unique<WindowsButton>();
    }

    std::unique_ptr<Checkbox> createCheckbox() override {
        return std::make_unique<WindowsCheckbox>();
    }
};

class MacFactory : public GUIFactory {
public:
    std::unique_ptr<Button> createButton() override {
        return std::make_unique<MacButton>();
    }

    std::unique_ptr<Checkbox> createCheckbox() override {
        return std::make_unique<MacCheckbox>();
    }
};

void renderUI(GUIFactory& factory) {
    auto button = factory.createButton();
    auto checkbox = factory.createCheckbox();

    button->render();
    checkbox->render();
}

int main() {
    WindowsFactory winFactory;
    MacFactory macFactory;

    std::cout << "Using Windows Factory:\n";
    renderUI(winFactory);

    std::cout << "\nUsing Mac Factory:\n";
    renderUI(macFactory);

    return 0;
}
相关推荐
青草地溪水旁5 分钟前
设计模式(C++)详解——策略模式(1)
c++·设计模式·策略模式
o0向阳而生0o34 分钟前
105、23种设计模式之策略模式(14/23)
设计模式·策略模式
余衫马1 小时前
llama.cpp:本地大模型推理的高性能 C++ 框架
c++·人工智能·llm·llama·大模型部署
胖咕噜的稞达鸭1 小时前
算法入门:专题攻克主题一---双指针(2)快乐数 呈最多水的容器
开发语言·数据结构·c++·算法
孞㐑¥1 小时前
Linux网络部分—网络层
linux·c++·经验分享·笔记
班公湖里洗过脚2 小时前
第1章 线程安全的对象生命期管理
c++
charlie1145141913 小时前
精读C++设计模式20 —— 结构型设计模式:桥接模式
开发语言·c++·学习·设计模式·桥接模式·c++23·概论
da_vinci_x4 小时前
设计稿秒出“热力图”:AI预测式可用性测试工作流,上线前洞察用户行为
前端·人工智能·ui·设计模式·可用性测试·ux·设计师
BS_Li4 小时前
用哈希表封装unordered_set和unordered_map
数据结构·c++·哈希算法·散列表
waves浪游4 小时前
C++多态
开发语言·c++