专业编程基础技术教程

网站首页 > 基础教程 正文

C++设计模式-工厂方法模式

ccvgpt 2024-08-16 15:06:44 基础教程 13 ℃

官方定义

工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。

实现代码

假设你正在做跨平台的UI设计,需要在Windows、Linux平台使用。后续可能还会添加其他应用平台。在设计UI控件时候就可以采用工厂方法模式。基础对话框Dialog类使用不同的 UI 组件渲染窗口。 在不同的操作系统下, 这些组件外观或许略有不同, 但其功能保持一致。 Windows 系统中的按钮在 Linux 系统中仍然是按钮。

C++设计模式-工厂方法模式

//抽象基类-按钮
class Button {
public:
	virtual ~Button(){}
	//渲染
	virtual void render() = 0;
	//点击
	virtual void onClicked() = 0;
};

//Windows平台的按钮
class WindowsButton : public Button {
public:
	// 通过 Button 继承
	virtual void render() override
	{
		cout << "WindowsButton渲染完成" << endl;
	}
	virtual void onClicked() override
	{
		cout << "WindowsButton鼠标点击" << endl;
	}
};

//Linux平台的按钮
class LinuxButton : public Button {
public:
	// 通过 Button 继承
	virtual void render() override
	{
		cout << "LinuxButton渲染完成" << endl;
	}
	virtual void onClicked() override
	{
		cout << "LinuxButton鼠标点击" << endl;
	}
};

//抽象基类-对话框
class Dialog {
public:
	virtual ~Dialog() {}
	void buttonTest() {
		Button* button = creatButton();
		button->render();
		button->onClicked();
	}
protected:
	virtual Button* creatButton() = 0;
};

class WindowsDialog: public Dialog {
public:
	// 通过 Dialog 继承
	virtual Button* creatButton() override
	{
		return new WindowsButton;
	}
};

class LinuxDialog : public Dialog {
public:
	// 通过 Dialog 继承
	virtual Button* creatButton() override
	{
		return new LinuxButton;
	}
};

int main(void) {
	Dialog* windowDialog = new WindowsDialog;
	windowDialog->buttonTest();
	Dialog* linuxDialog = new LinuxDialog;
	linuxDialog->buttonTest();
	return 0;
}

输出

WindowsButton渲染完成
WindowsButton鼠标点击
LinuxButton渲染完成
LinuxButton鼠标点击

最近发表
标签列表