官方定义
工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。
实现代码
假设你正在做跨平台的UI设计,需要在Windows、Linux平台使用。后续可能还会添加其他应用平台。在设计UI控件时候就可以采用工厂方法模式。基础对话框Dialog类使用不同的 UI 组件渲染窗口。 在不同的操作系统下, 这些组件外观或许略有不同, 但其功能保持一致。 Windows 系统中的按钮在 Linux 系统中仍然是按钮。
//抽象基类-按钮
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鼠标点击