【设计模式】抽象工厂模式

概念

创建型模式


类图


代码

cpp 复制代码
#include <iostream>

using namespace std;

class Button {
public:
    virtual ~Button()= default;;
    virtual string Paint() const = 0;
};

class WinButton : public Button {
public:
    string Paint() const override {
        return "WinButton Paint\n";
    }
};

class MacButton : public Button {
public:
    string Paint() const override {
        return "MacButton Paint\n";
    }
};

class Checkbox {
public:
    virtual ~Checkbox()= default;;
    virtual string Paint() const = 0;
};

class WinCheckbox : public Checkbox {
public:
    string Paint() const override {
        return "WinCheckbox Paint\n";
    }
};

class MacCheckbox : public Checkbox {
public:
    string Paint() const override {
        return "MacCheckbox Paint\n";
    }
};

class GUIFactory {
public:
    virtual ~GUIFactory()= default;;
    virtual Button *CreateButton() const = 0;
    virtual Checkbox *CreateCheckbox() const = 0;
};

class WinFactory : public GUIFactory {
public:
    Button *CreateButton() const override {
        return new WinButton();
    }

    Checkbox *CreateCheckbox() const override {
        return new WinCheckbox();
    }
};

class MacFactory : public GUIFactory {
public:
    Button *CreateButton() const override {
        return new MacButton();
    }

    Checkbox *CreateCheckbox() const override {
        return new MacCheckbox();
    }
};

class Application {
public:
    explicit Application(GUIFactory* factory) {
        this->factory = factory;
    }

    void CreateUI() {
        button = factory->CreateButton();
        checkbox = factory->CreateCheckbox();
    }

    void Paint() {
        cout << button->Paint();
        cout << checkbox->Paint();
    }

private:
    GUIFactory* factory{};
    Button* button{};
    Checkbox *checkbox{};
};

int main(int argc, char *argv[]) {
    string config = "Windows";
    GUIFactory *factory;

    if (config == "Windows") {
        factory = new WinFactory();
    } else if (config == "Mac") {
        factory = new MacFactory();
    } else {
        cout << "Error! Unknown Operating System Type!" << endl;
        return -1;
    }

    Application app = Application(factory);
    app.CreateUI();
    app.Paint();

    delete factory;

    return 0;
}
相关推荐
货拉拉技术7 分钟前
重塑 Agent 度量衡:基于 LLM-as-a-Judge 的离线评估体系与实践
算法·设计模式
wuminyu8 分钟前
JDK21解决虚拟线程IO阻塞原理剖析
java·linux·c语言·jvm·c++
MC皮蛋侠客10 分钟前
TDengine C++ 系列(4):时序查询——窗口聚合、插值、连接与时序函数
大数据·c++·tdengine
junuo18 分钟前
10_C++内存分区与动态内存管理
c++·编程语言
欧特克_Glodon38 分钟前
OpenCV计算机视觉开发入门与实践<二>:图像噪声与图像处理
c++·图像处理·opencv·计算机视觉
KhalilRuan41 分钟前
设计模式小记
设计模式
键盘会跳舞1 小时前
C++:函数对象与 std::function 源码级深度拆解——泛型算法的策略内核与可调用对象统一封装
c++·算法·仿函数
卡牌RWA研究院1 小时前
Relique:一张精品卡牌如何从收藏品变成可交易的链上资产?
设计模式·金融·区块链·创业创新
Augustzero1 小时前
为什么高性能调度器都在“偷任务”?从无锁队列看懂工作窃取
c++·后端
(Charon)1 小时前
【C++】线程安全队列(三):MPSC无锁队列、atomic与链表节点实现
c++·安全·链表