讲师中心 微信公众号
AI工具推荐 视频效率加速

c++怎么实现简单工厂模式_c++设计模式入门【实战】

落婷君_4442

落婷君_4442

发布时间:2026-03-13 09:16:03

|

621人浏览过

|

来源于php中文网

原创

new不能直接写死在业务逻辑里,否则更换具体类型需修改所有调用点,增加编译、测试、上线成本;工厂模式通过分离“造什么”与“怎么用”,使业务代码仅依赖接口,不接触new。

c++怎么实现简单工厂模式_c++设计模式入门【实战】

为什么 new 不能直接写死在业务逻辑里

因为一旦要换具体类型(比如从 JsonParser 切到 XmlParser),就得改所有调用点,编译、测试、上线成本全涨。工厂模式本质是把“造什么”和“怎么用”拆开——业务代码只认接口,不碰 new。

常见错误现象:std::unique_ptr<base> p = std::make_unique<derived>();</derived> 看似解耦,但业务层仍得包含 Derived.h,头文件依赖没断干净。

  • 真正解耦的关键:工厂类单独编译,业务层只通过头文件看到纯虚接口和工厂函数声明
  • 工厂函数返回 std::unique_ptr<base>,避免裸指针和内存泄漏
  • 不要在工厂内部用 switch 或 if-else 直接 new,优先用映射表(std::map<:string std::function>()>></:string>)支持运行时注册

SimpleFactory::create() 的参数设计陷阱

传字符串字面量最常见,但拼错就崩溃(比如 "json" 写成 "jason"),且无编译期检查。更稳的做法是用枚举:

enum class ParserType { JSON, XML, YAML };

这样编译器能帮你拦住非法值,也方便后续扩展(比如加 ParserType::BINARY)。

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

  • 如果必须用字符串,create() 内部应有兜底逻辑:return nullptr 或抛 std::invalid_argument,不能静默返回空指针
  • 避免把配置项(如文件路径、编码格式)塞进工厂函数参数——那是具体实现类该处理的,工厂只管“选型”
  • 返回 std::optional<:unique_ptr>></:unique_ptr> 比裸指针更明确表达“可能造不出来”

静态工厂 vs. 实例化工厂:什么时候该用 static

简单工厂通常写成静态函数,因为不需要状态。但一旦涉及资源池、缓存、线程安全或依赖注入(比如工厂本身需要 Logger),就必须实例化。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

容易踩的坑:static 成员变量在多线程下未加锁就初始化,导致重复构造或竞态;或者误以为静态工厂能自动管理生命周期,结果单例对象析构顺序引发 crash。

  • 纯类型创建(无外部依赖、无状态)→ 用 static 成员函数,轻量清晰
  • 需要读配置、连数据库、记日志 → 工厂必须是类实例,且生命周期由上层(如 Application 类)统一管理
  • 别为了“看起来像设计模式”而强行把工厂做成单例——C++ 里全局单例比 Java 更危险,尤其涉及静态对象析构顺序时

模板化简单工厂的适用边界

有人会写 template<typename t> std::unique_ptr<t> create() { return std::make_unique<t>(); }</t></t></typename>,看似通用,实则破坏了“面向接口编程”的初衷——调用方又得知道具体类型名,跟直接 new 差不多。

真正该模板化的是工厂注册机制,比如:

template<typename T> void register_parser(const std::string& name) { registry[name] = []{ return std::make_unique<T>(); };

这样新增类型只需一行注册,不改工厂核心逻辑。

  • 模板工厂适合构建工具链(如序列化器、编码器),不适合业务实体(如 User、Order)——后者类型关系复杂,硬套模板反而难维护
  • 注意编译单元隔离:模板定义必须在头文件里,否则链接时报 undefined reference
  • 如果不同模块注册同名类型(比如两个库都注册 "json"),得靠命名空间或前缀区分,否则后注册的覆盖前一个

最常被忽略的一点:工厂返回的对象,其析构时机必须明确。如果工厂内部用了 std::shared_ptr 缓存实例,而业务层又用 std::unique_ptr 接收,就会 double-free。类型擦除和所有权转移,比看上去更脆。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2135

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3262

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1096

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

3739

2025.09.10

switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

1071

2023.09.21

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

1417

2024.03.13

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1738

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2684

2023.09.04

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

80

2026.10.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn