【C++设计模式】第三篇:抽象工厂模式(AbstractFactory)
- 创业
- 2025-09-11 00:18:01

注意:复现代码时,确保 VS2022 使用 C++17/20 标准以支持现代特性。
构建相关对象族的统一接口,保障产品兼容性1. 模式定义与用途
核心目标:提供一个接口,用于创建一系列相关或依赖对象,而无需指定它们的具体类。 常见场景:
跨平台UI系统(同时创建风格一致的按钮、窗口、滚动条)数据库访问层(统一生成连接、命令、事务对象,支持多种数据库)游戏资源加载(为不同画质模式创建匹配的材质、模型、音效)2. 模式结构解析 AbstractFactory:声明创建产品族的方法(如 createButton(), createWindow())ConcreteFactory:实现具体产品族的创建(如 WindowsFactory, MacOSFactory)AbstractProduct:定义产品接口(如 IButton, IWindow)ConcreteProduct:实现具体产品(如 WindowsButton,MacOSWindow)
3. 现代 C++ 实现示例:跨平台UI组件 3.1 基础实现 #include <iostream> #include <memory> // 抽象产品:按钮 class IButton { public: virtual ~IButton() = default; virtual void render() const = 0; }; // 具体产品:Windows 按钮 class WindowsButton : public IButton { public: void render() const override { std::cout << "[Windows] Flat-style button\n"; } }; // 具体产品:MacOS 按钮 class MacOSButton : public IButton { public: void render() const override { std::cout << "[MacOS] Rounded button\n"; } }; // 抽象产品:窗口 class IWindow { public: virtual ~IWindow() = default; virtual void draw() const = 0; }; // 具体产品:Windows 窗口 class WindowsWindow : public IWindow { public: void draw() const override { std::cout << "[Windows] Rectangular window with Aero effect\n"; } }; // 具体产品:MacOS 窗口 class MacOSWindow : public IWindow { public: void draw() const override { std::cout << "[MacOS] Rounded corners window with traffic lights\n"; } }; // 抽象工厂 class UIFactory { public: virtual ~UIFactory() = default; virtual std::unique_ptr<IButton> createButton() const = 0; virtual std::unique_ptr<IWindow> createWindow() const = 0; }; // 具体工厂:Windows 风格 class WindowsUIFactory : public UIFactory { public: std::unique_ptr<IButton> createButton() const override { return std::make_unique<WindowsButton>(); } std::unique_ptr<IWindow> createWindow() const override { return std::make_unique<WindowsWindow>(); } }; // 具体工厂:MacOS 风格 class MacOSUIFactory : public UIFactory { public: std::unique_ptr<IButton> createButton() const override { return std::make_unique<MacOSButton>(); } std::unique_ptr<IWindow> createWindow() const override { return std::make_unique<MacOSWindow>(); } }; // 客户端:构建完整UI界面 void buildUI(const UIFactory& factory) { auto button = factory.createButton(); auto window = factory.createWindow(); window->draw(); button->render(); } int main() { WindowsUIFactory winFactory; buildUI(winFactory); // 输出Windows风格组件 MacOSUIFactory macFactory; buildUI(macFactory); // 输出MacOS风格组件 return 0; }
代码解析:
工厂类(WindowsUIFactory/MacOSUIFactory)确保创建的按钮、窗口风格一致。新增产品类型(如滚动条)只需扩展抽象工厂接口,无需修改已有客户端代码。3.2 动态配置的多主题支持 #include <unordered_map> #include <functional> // 主题类型枚举 enum class ThemeType { Material, Neumorphism, PixelArt }; // 抽象工厂注册模板(C++17 特性) template <typename T> class ThemeFactoryRegistry { public: using FactoryCreator = std::function<std::unique_ptr<T>()>; static void registerTheme(ThemeType type, FactoryCreator creator) { getRegistry()[type] = creator; } static std::unique_ptr<T> create(ThemeType type) { auto it = getRegistry().find(type); if (it != getRegistry().end()) { return it->second(); } throw std::runtime_error("Unsupported theme type"); } private: static std::unordered_map<ThemeType, FactoryCreator>& getRegistry() { static std::unordered_map<ThemeType, FactoryCreator> registry; return registry; } }; // 具体主题注册示例 class MaterialUIFactory : public UIFactory { /*...*/ }; class NeumorphismUIFactory : public UIFactory { /*...*/ }; void registerThemes() { ThemeFactoryRegistry<UIFactory>::registerTheme( ThemeType::Material, [] { return std::make_unique<MaterialUIFactory>(); } ); ThemeFactoryRegistry<UIFactory>::registerTheme( ThemeType::Neumorphism, [] { return std::make_unique<NeumorphismUIFactory>(); } ); } // 运行时切换主题 void loadUserPreferredTheme() { auto factory = ThemeFactoryRegistry<UIFactory>::create(ThemeType::Neumorphism); buildUI(*factory); }
代码解析:
利用模板和 std::function 实现主题动态注册,支持热切换。结合配置文件可实现用户自定义主题的实时加载。4. 应用场景示例:数据库访问抽象 // 抽象产品:数据库连接 class IDBConnection { public: virtual void open() = 0; virtual void execute(const std::string& query) = 0; }; // 抽象产品:数据库事务 class IDBTransaction { public: virtual void begin() = 0; virtual void commit() = 0; }; // 抽象工厂 class DBFactory { public: virtual std::unique_ptr<IDBConnection> createConnection() = 0; virtual std::unique_ptr<IDBTransaction> createTransaction() = 0; }; // MySQL 具体实现 class MySQLConnection : public IDBConnection { /*...*/ }; class MySQLTransaction : public IDBTransaction { /*...*/ }; class MySQLFactory : public DBFactory { public: std::unique_ptr<IDBConnection> createConnection() override { return std::make_unique<MySQLConnection>(); } std::unique_ptr<IDBTransaction> createTransaction() override { return std::make_unique<MySQLTransaction>(); } }; // PostgreSQL 具体实现 class PostgreSQLConnection : public IDBConnection { /*...*/ }; class PostgreSQLTransaction : public IDBTransaction { /*...*/ }; // 客户端代码保持与具体数据库解耦 void runDatabaseOperations(DBFactory& factory) { auto conn = factory.createConnection(); auto txn = factory.createTransaction(); conn->open(); txn->begin(); // ... 执行操作 txn->commit(); }
5. 优缺点分析 优点缺点严格保证产品族的兼容性新增产品类型需修改所有工厂隐藏具体类实现细节代码复杂度随产品数量指数增长易于切换整个产品系列需要预先设计完善的产品层次
6. 调试与优化策略 类型安全检查:使用 typeid 或 dynamic_cast 验证多态对象的实际类型。性能监控:对高频创建的对象族,采用原型模式(Prototype)缓存实例。跨平台测试:结合条件编译(#ifdef)验证不同工厂的行为一致性。
模式结构解析网图备份
【C++设计模式】第三篇:抽象工厂模式(AbstractFactory)由讯客互联创业栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“【C++设计模式】第三篇:抽象工厂模式(AbstractFactory)”