抽象工厂模式 = "工厂的工厂",专门用来批量生产"一组相关产品",而且这组产品可以随意换"家族"。
举个最经典的例子(UI跨平台):
你要做一个支持 Windows 和 macOS 的 App,需要以下控件:
Button
Checkbox
TextBox
每种控件在 Windows 和 macOS 上长得不一样,但都属于同一"家族"。
不用抽象工厂:
C++if (os == "Windows") {
new WinButton();
new WinCheckbox();
} else {
new MacButton();
new MacCheckbox();
}
用抽象工厂:
C++// 1. 先定义抽象工厂接口(一家工厂能生一整套控件)
class GUIFactory {
public:
virtual Button* createButton() = 0;
virtual Checkbox* createCheckbox() = 0;
};
// 2. 具体工厂(Windows家族、Mac家族)
class WinFactory : public GUIFactory {
Button* createButton() override { return new WinButton(); }
Checkbox* createCheckbox() override { return new WinCheckbox(); }
};
class MacFactory : public GUIFactory {
Button* createButton() override { return new MacButton(); }
Checkbox* createCheckbox() override { return new MacCheckbox(); }
};
// 3. 客户端代码(完全与具体平台解耦)
GUIFactory* factory = (os == "mac") ? new MacFactory() : new WinFactory();
Button* btn = factory->createButton(); // 自动就是对应平台的按钮
Checkbox* chk = factory->createCheckbox(); // 同理
一句话总结(面试金句):
抽象工厂模式就是给"一族相关对象"提供一个创建接口,让你换平台时只换一个工厂就行,完全不用改客户端代码。
记住这张图就行了:
text抽象工厂接口
├── Windows 工厂 → 生产 WinButton + WinCheckbox
└── Mac 工厂 → 生产 MacButton + MacCheckbox
背完这 60 秒,下次面试有人问"抽象工厂和工厂方法的区别",你直接甩:
"工厂方法是一个产品一个工厂,抽象工厂是一族产品一个工厂",直接秒杀。