商城首页欢迎来到中国正版软件门户

您的位置:首页 >C++工厂模式实现与解耦实战

C++工厂模式实现与解耦实战

  发布于2026-03-14 阅读(0)

扫一扫,手机访问

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

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

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

1. 为什么需要工厂模式

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

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

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

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

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

// 具体图形类 class Circle : public Shape { public: void draw() override { std::cout << "Drawing a Circle\n"; } };

class Rectangle : public Shape { public: void draw() override { std::cout << "Drawing a Rectangle\n"; } };

// 工厂类 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<std::string, CreateFunc>& getMap() { static std::map<std::string, CreateFunc> 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;</font>

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

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

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

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

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

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

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

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。
  • 豆瓣怎么设置主页不可见?豆瓣设置隐私主页教程 正版软件
    豆瓣怎么设置主页不可见?豆瓣设置隐私主页教程
    豆瓣怎么设置主页不可见?大家在使用豆瓣的时候,经常会在主页发布自己的心情状态、吐槽等等内容,然后其他用户进我们的主页的时候就能很轻松的看到我们发过的内容,那么我们能不能设置主页的隐私呢?要怎么设置呢?下面小编就为大家介绍一下豆瓣个人主页设置隐私的办法。
    1小时前 10:50 0
  • 夸克浏览器怎么设置电脑模式?夸克浏览器设置成电脑模式教程 正版软件
    夸克浏览器怎么设置电脑模式?夸克浏览器设置成电脑模式教程
    夸克浏览器怎么设置电脑模式?嘿,兄弟们,你是否曾经需要在手机上看网页,但又要让页面显示效果如同在电脑上的体验?如果是,那么恭喜您,夸克浏览器就是您的不二之选!它不仅拥有简洁明了的界面设计,而且夸克浏览器手机版也可以轻松设置成电脑版,让你在手机端也能够享受到如同在电脑上的浏览体验。
    昨天 03-21 12:02 0
  • 夸克浏览器怎么开启成人模式?夸克浏览器设置成人模式的方法 正版软件
    夸克浏览器怎么开启成人模式?夸克浏览器设置成人模式的方法
    如今电子产品不仅成年人在使用,未成年也是深深着迷,而各大产品为了更好的把控未成年人的电子产品使用时间,因此很多应用都提供了未成年模式,像夸克浏览器也一样,那么夸克浏览器怎么开启成人模式呢?夸克浏览器设置成人模式的方法1、打开您的夸克浏览器应用,点击屏幕右下角的三横线菜单图标。
    昨天 03-21 11:51 0
  • 东方甄选如何进行企业团购?东方甄选企业团购教程 正版软件
    东方甄选如何进行企业团购?东方甄选企业团购教程
    东方甄选如何进行企业团购?每次节日到来前,各位企业的小伙伴是不是还在发愁为购买公司的礼品而发愁?不妨来看看东方甄选专享的企业团购吧!东方甄选能够给企业礼物提供定制化解决方案、企业优惠、专属服务,满足多元化的需求,让企业采购简单快捷、更省心,也能让员工更放心更满意。
    昨天 03-21 11:39 0
  • 饿了么怎么让别人代付?饿了么让别人代付的步骤教程 正版软件
    饿了么怎么让别人代付?饿了么让别人代付的步骤教程
    饿了么怎么让别人代付?现在夏天越来越热,相信在暑假时期外卖就是大家的救命稻草,饿了么这个软件大家应该也是十分熟悉,但是很多小伙伴跟小编反馈说不知道饿了么怎么让别人代付订单,那接下来小编就来给大家解决问题,带来饿了么让别人代付的步骤,一起来往下看看吧!
    昨天 03-20 13:52 0

热门关注