模式特点
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂是工厂方法的升级,用于创建产品族。
- 同一工厂创建的产品属于同一产品族,相互兼容
- 切换工厂即可切换整套产品族
- 新增产品族容易,新增产品类型困难
类图
应用场景
- 跨平台 GUI 框架:Windows/Mac/Linux 不同的按钮、输入框样式
- Qt 样式主题系统:不同主题下整套控件外观切换
- 游戏开发:不同难度等级的武器、怪物、道具套装
- 数据库迁移工具:不同数据库的表、索引、触发器创建
示例代码(C++)
// 抽象产品族 class Button { public: virtual void render() = 0; virtual ~Button() = default; }; class Input { public: virtual void render() = 0; virtual ~Input() = default; }; // Windows 产品族 class WinButton : public Button { public: void render() override { std::cout << "[Windows Button]" << std::endl; } }; class WinInput : public Input { public: void render() override { std::cout << "[Windows Input]" << std::endl; } }; // Mac 产品族 class MacButton : public Button { public: void render() override { std::cout << "[Mac Button]" << std::endl; } }; class MacInput : public Input { public: void render() override { std::cout << "[Mac Input]" << std::endl; } }; // 抽象工厂 class GUIFactory { public: virtual Button* createButton() = 0; virtual Input* createInput() = 0; virtual ~GUIFactory() = default; }; class WindowsFactory : public GUIFactory { public: Button* createButton() override { return new WinButton(); } Input* createInput() override { return new WinInput(); } };