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

概念

创建型模式


类图


代码

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;
}
相关推荐
rainbow688920 小时前
EffectiveC++入门:四大习惯提升代码质量
c++
秋邱21 小时前
用 Python 写出 C++ 的性能?用CANN中PyPTO 算子开发硬核上手指南
开发语言·c++·python
我在人间贩卖青春21 小时前
C++之析构函数
c++·析构函数
我在人间贩卖青春21 小时前
C++之数据类型的扩展
c++·字符串·数据类型
wangjialelele1 天前
平衡二叉搜索树:AVL树和红黑树
java·c语言·开发语言·数据结构·c++·算法·深度优先
苏宸啊1 天前
C++栈和队列
c++
森G1 天前
七、04ledc-sdk--------makefile有变化
linux·c语言·arm开发·c++·ubuntu
J_liaty1 天前
23种设计模式一代理模式
设计模式·代理模式
橘颂TA1 天前
【测试】高效浏览器操作:基础功能与优化设置大全
c++·功能测试·职场和发展·测试·web测试
一只小小的芙厨1 天前
寒假集训笔记·以点为对象的树形DP
c++·算法