经过前两天的学习,我们已经掌握了单例模式与工厂方法模式,理解了如何控制实例个数与如何通过子类封装对象的创建逻辑。
今天,我们将进一步深入“工厂”体系,学习抽象工厂模式(Abstract Factory Pattern),这是在实际项目中**用于创建“产品族”**的关键设计模式。
抽象工厂模式提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。
关键词:“一系列相关对象” → 产品族
+------------------------+
| AbstractFactory |
|------------------------|
| +createButton() |
| +createCheckbox() |
+-----------+------------+
|
+-----------------+-----------------+
| |
+-------------+ +----------------+
| WinFactory | | MacFactory |
+-------------+ +----------------+
| +createButton() | | +createButton() |
| +createCheckbox() | | +createCheckbox()|
产品结构(同理)
+-----------------+ +------------------+
| AbstractButton |<------| WinButton |
| | | MacButton |
+-----------------+ +------------------+
我们来设计一个跨平台 GUI 库,可以根据平台生成不同风格的按钮和复选框。
class Button {
public:
virtual void paint() = 0;
virtual ~Button() {}
};
class Checkbox {
public:
virtual void paint() = 0;
virtual ~Checkbox() {}
};
class WinButton : public Button {
public:
void paint() override {
std::cout << "绘制 Windows 风格按钮" << std::endl;
}
};
class MacButton : public Button {
public:
void paint() override {
std::cout << "绘制 Mac 风格按钮" << std::endl;
}
};
class WinCheckbox : public Checkbox {
public:
void paint() override {
std::cout << "绘制 Windows 风格复选框" << std::endl;
}
};
class MacCheckbox : public Checkbox {
public:
void paint() override {
std::cout << "绘制 Mac 风格复选框" << std::endl;
}
};
class GUIFactory {
public:
virtual Button* createButton() = 0;
virtual Checkbox* createCheckbox() = 0;
virtual ~GUIFactory() {}
};
class WinFactory : public GUIFactory {
public:
Button* createButton() override {
return new WinButton();
}
Checkbox* createCheckbox() override {
return new WinCheckbox();
}
};
class MacFactory : public GUIFactory {
public:
Button* createButton() override {
return new MacButton();
}
Checkbox* createCheckbox() override {
return new MacCheckbox();
}
};
void render(GUIFactory* factory) {
Button* btn = factory->createButton();
Checkbox* chk = factory->createCheckbox();
btn->paint();
chk->paint();
delete btn;
delete chk;
}
int main() {
WinFactory win;
MacFactory mac;
render(&win);
render(&mac);
return 0;
}
设计一个跨平台图标与窗口组件的 UI 系统,要求使用抽象工厂模式构造 Icon
与 Window
两类产品族,支持 Windows 与 Linux 两个平台。
抽象工厂模式和工厂方法模式的最大区别是什么?请简洁说明并举例。
抽象工厂模式适合管理“产品族”,比工厂方法更进一步封装了对象创建的整体体系。掌握它有助于构建可扩展、可复用、风格一致的大型软件系统。
明日预告:建造者模式(Builder Pattern) —— 用来构建“结构复杂对象”的强大模式,适合生成器、配置器类场景。