C++ 工厂模式怎么写_C++设计模式解耦实战

工厂模式通过封装对象创建过程实现解耦,C++中可采用简单工厂、工厂方法或注册机制;推荐使用静态映射表结合函数指针的注册式工厂,实现运行时动态创建,提升扩展性与模块化程度。

c++ 工厂模式怎么写_c++设计模式解耦实战

工厂模式是一种常用的设计模式,主要用于对象的创建过程解耦。在 C++ 中使用工厂模式,可以让程序在不修改原有代码的情况下扩展新类型,提升可维护性和可扩展性。下面通过一个实际场景来说明如何用 C++ 实现工厂模式,并实现模块间的解耦。

1. 为什么需要工厂模式

假设你正在开发一个绘图系统,需要绘制圆形、矩形、三角形等图形。如果直接在主逻辑中使用 new Circlenew Rectangle,那么每当新增一种图形,就必须修改代码,违反了“开闭原则”(对扩展开放,对修改关闭)。

工厂模式的核心思想是:把对象的创建过程封装起来,由一个“工厂”来统一负责创建对象,调用方无需知道具体类名,只需提供标识或条件即可获取实例。

2. 简单工厂模式(Simple Factory)

简单工厂不是严格意义上的设计模式,但很实用。它通过一个工厂类根据输入参数决定创建哪种对象。

立即学习“C++免费学习笔记(深入)”;

// 图形基类class Shape {public: virtual void draw() = 0; virtual ~Shape() = default;};

// 具体图形类class Circle : public Shape {public:void draw() override {std::cout wing a Circlen”;}};

class Rectangle : public Shape {public:void draw() override {std::cout

// 工厂类class ShapeFactory {public:static Shape* createShape(const std::string& type) {if (type == “circle”) {return new Circle();} else if (type == “rectangle”) {return new Rectangle();}return nullptr;}};

使用方式:

Shape* shape = ShapeFactory::createShape(“circle”);shape->draw();

优点是调用简单;缺点是新增类型需要修改工厂方法,不够灵活。

3. 工厂方法模式(Factory Method)

为了解决简单工厂的扩展问题,可以使用工厂方法模式——为每种产品定义一个对应的工厂类。

// 工厂接口class ShapeFactory {public: virtual Shape* createShape() = 0; virtual ~ShapeFactory() = default;};

// 圆形工厂class CircleFactory : public ShapeFactory {public:Shape* createShape() override {return new Circle();}};

// 矩形工厂class RectangleFactory : public ShapeFactory {Shape* createShape() override {return new Rectangle();}};

客户端代码:

ShapeFactory* factory = new CircleFactory();Shape* shape = factory->createShape();shape->draw();

这样,增加新图形时只需添加新的工厂类,不需要改动已有逻辑,符合开闭原则。

4. 抽象工厂与注册机制(推荐实战写法)

在实际项目中,更常见的是结合“注册+映射”的方式,实现运行时动态创建,彻底解耦。

我们可以用一个静态映射表,将类型字符串和创建函数绑定:

using CreateFunc = Shape*(*)();

class ShapeRegistry {private:static std::map& getMap() {static std::map map;return map;}

public:static void registerShape(const std::string& name, CreateFunc func) {getMap()[name] = func;}

static Shape* createShape(const std::string& name) {    auto& map = getMap();    if (map.find(name) != map.end()) {        return map[name]();    }    return nullptr;}

};

// 宏定义简化注册

define REGISTER_SHAPE(type)

Shape* create##type() { return new type(); } static struct type##Registrar {     type##Registrar() {         ShapeRegistry::registerShape(#type, create##type);     } } registrar_##type;

在每个图形类后加上注册宏:

class Circle : public Shape { // … 同上};REGISTER_SHAPE(Circle)

class Rectangle : public Shape {// …};REGISTER_SHAPE(Rectangle)

使用时无需包含具体类头文件,只需链接对应目标文件,运行时自动注册:

Shape* shape = ShapeRegistry::createShape(“Circle”);if (shape) shape->draw();

这种写法广泛用于插件系统、序列化框架、游戏资源管理等场景,真正实现了“配置驱动创建”,高度解耦。

基本上就这些。从简单工厂到注册机制,关键是理解“把创建行为集中并抽象”,让业务逻辑不再依赖具体类型。C++ 虽然没有反射,但通过函数指针+静态注册,也能实现类似效果。实际项目中建议采用注册式工厂,便于模块拆分和后期维护。

以上就是C++ 工厂模式怎么写_C++设计模式解耦实战的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1489705.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 12:38:09
下一篇 2025年12月19日 12:38:24

相关推荐

发表回复

登录后才能评论
关注微信