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

概念

创建型模式


类图


代码

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;
}
相关推荐
ShineWinsu7 分钟前
对于Qt:QLCDNumber常见属性以及QTimer的解析
服务器·数据库·c++·qt·gui·qtimer·qlcdnumber
是2的10次方啊11 分钟前
设计模式与生活⑨:一碗胡辣汤,用不着认识十几种香料
设计模式
xiaoye-duck14 分钟前
《C++ 工具库实战》C++ 解析利器 JsonCpp:从基础使用到封装简易 JSON 工具
c++·json·第三方库
dialect_8 小时前
KMP算法
开发语言·c++·算法
ShineWinsu10 小时前
对于Qt:QRadioButton常见属性以及QButtonGroup的解析
数据库·c++·qt·microsoft·gui·qradiobutton·qbuttongroup
傲世仙尊11 小时前
多态-虚表才活到运行期符号表早已消失
c++
chenbingjie_c11 小时前
C++ 多态完全指南:从虚函数重写到虚函数表原理
开发语言·c++
是main不是漫11 小时前
【双指针——移动零】数组划分类题目的入门基石
c++·算法
·present·11 小时前
CSAPP(Bomb lab)
c语言·c++
王老师青少年编程11 小时前
2026年信奥赛c++普及组csp-j第二轮复赛真题
c++·真题·csp·信奥赛