【C++设计模式–工厂(Factory)模式】——对象创建的优雅解耦方案
- 创业
- 2025-09-02 16:15:02

【C++设计模式 – 工厂(Factory)模式】—— 对象创建的优雅解耦方案 工厂模式 什么是工厂模式?
工厂模式是一种创建型设计模式,其核心目标是将对象的实例化过程从使用对象的代码中解耦,通过统一接口实现对象的动态创建。该模式适用于需要根据不同条件生成不同类对象的场景,使系统更符合“开闭原则”(对扩展开放,对修改关闭)。
工厂模式的特点封装创建过程:将对象的创建逻辑集中在工厂类中,避免业务代码与具体类耦合。多态性支持:通过接口或基类定义产品对象,允许灵活替换具体实现。扩展性强:新增产品类型时无需修改客户端代码,只需扩展工厂即可。标准化生产:所有产品遵循统一接口,确保使用一致性。
为何选择工厂模式?降低耦合性:客户端无需关注对象创建细节,只需通过接口使用。集中管控:统一管理对象的创建逻辑,便于维护和权限控制(如资源复用)。灵活扩展:新增产品时只需新增工厂类或方法,无需改动已有代码。条件分支优化:替代代码中复杂的if-else或switch条件判断,提升可读性。
工厂模式的不足类数量膨胀:每增加一个产品可能需要新增工厂类,增加代码复杂度。理解成本:需设计合理的继承层次,过度设计可能影响开发效率。抽象限制:产品必须基于同一接口,若差异过大可能难以抽象。
工厂模式的实现 简单工厂模式(非严格设计模式) 通过单一工厂类根据参数返回不同产品实例。 #include <iostream> // 抽象产品类 class Shape { public: virtual void draw() = 0; virtual ~Shape() = default; }; // 具体产品:圆形 class Circle : public Shape { public: void draw() override { std::cout << "Drawing Circle\n"; } }; // 具体产品:矩形 class Rectangle : public Shape { public: void draw() override { std::cout << "Drawing Rectangle\n"; } }; // 简单工厂 class ShapeFactory { public: static Shape* createShape(const std::string& type) { if (type == "Circle") return new Circle(); if (type == "Rectangle") return new Rectangle(); return nullptr; } }; int main() { Shape* circle = ShapeFactory::createShape("Circle"); Shape* rect = ShapeFactory::createShape("Rectangle"); circle->draw(); // "Drawing Circle" rect->draw(); // "Drawing Rectangle" delete circle, delete rect; return 0; }**特点:**实现简单但违反开闭原则(新增类型需修改工厂逻辑)。
工厂方法模式(Factory Method) 定义抽象工厂接口,由子类决定实例化哪个类。 #include <iostream> // 抽象产品 class Button { public: virtual void render() = 0; virtual ~Button() = default; }; // 具体产品:Windows按钮 class WinButton : public Button { public: void render() override { std::cout << "Windows Style Button\n"; } }; // 具体产品:Mac按钮 class MacButton : public Button { public: void render() override { std::cout << "MacOS Style Button\n"; } }; // 抽象工厂 class GUIFactory { public: virtual Button* createButton() = 0; virtual ~GUIFactory() = default; }; // 具体工厂:Windows风格 class WinFactory : public GUIFactory { public: Button* createButton() override { return new WinButton(); } }; // 具体工厂:Mac风格 class MacFactory : public GUIFactory { public: Button* createButton() override { return new MacButton(); } }; // 客户端代码 void Application(GUIFactory& factory) { Button* btn = factory.createButton(); btn->render(); delete btn; } int main() { WinFactory win; MacFactory mac; Application(win); // 输出:Windows Style Button Application(mac); // 输出:MacOS Style Button return 0; }**优势:**遵循开闭原则,新增产品无需修改现有工厂。
抽象工厂模式(Abstract Factory) 用于创建产品族(多组相关对象),确保产品间的兼容性。 #include <iostream> // 抽象产品:按钮 class Button { /* 同工厂方法示例 */ }; // 抽象产品:文本框 class TextBox { public: virtual void input() = 0; virtual ~TextBox() = default; }; // Windows组件 class WinButton : public Button { /* ... */ }; class WinTextBox : public TextBox { public: void input() override { std::cout << "Windows TextBox\n"; } }; // Mac组件 class MacButton : public Button { /* ... */ }; class MacTextBox : public TextBox { public: void input() override { std::cout << "MacOS TextBox\n"; } }; // 抽象工厂接口 class GUIFactory { public: virtual Button* createButton() = 0; virtual TextBox* createTextBox() = 0; virtual ~GUIFactory() = default; }; // 具体工厂实现 class WinFactory : public GUIFactory { public: Button* createButton() override { return new WinButton(); } TextBox* createTextBox() override { return new WinTextBox(); } }; class MacFactory : public GUIFactory { public: Button* createButton() override { return new MacButton(); } TextBox* createTextBox() override { return new MacTextBox(); } }; // 使用示例 void CreateUI(GUIFactory& factory) { Button* btn = factory.createButton(); TextBox* tb = factory.createTextBox(); btn->render(); tb->input(); delete btn, delete tb; } int main() { WinFactory winFac; MacFactory macFac; CreateUI(winFac); // 输出Windows系列组件 CreateUI(macFac); // 输出Mac系列组件 return 0; }适用场景:需要确保多个关联产品协同工作(如跨平台UI组件)。
工厂模式的选择策略 模式类型适用场景复杂度简单工厂产品类型固定且数量较少低工厂方法需要支持新产品的灵活添加中抽象工厂需创建一组高度关联的复杂对象高 总结:工厂模式通过封装对象创建逻辑,显著提升了代码的可维护性和可扩展性。虽然在简单场景可能略显复杂,但其在大型项目或框架设计中能有效降低模块间的耦合度,是面向对象设计中不可或缺的利器。
【C++设计模式–工厂(Factory)模式】——对象创建的优雅解耦方案由讯客互联创业栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“【C++设计模式–工厂(Factory)模式】——对象创建的优雅解耦方案”
下一篇
存储结构分类