c++如何实现工厂模式 c++设计模式之工厂方法【实例】
发布时间 - 2025-12-30 00:00:00 点击率:次工厂模式通过将“new具体类”移至独立工厂中实现创建解耦,调用方仅依赖抽象接口;简单工厂用静态函数按参数返回智能指针封装的子类对象,要求基类有虚析构函数。
工厂模式在C++中主要解决对象创建的解耦问题,核心是把“new具体类”的动作移到一个独立的工厂类或函数中,让调用方只依赖抽象接口,不关心具体类型如何构造。
简单工厂(非GoF标准,但实用)
用一个静态工厂函数根据参数返回不同子类对象,适合产品种类少、变化不频繁的场景。
关键点:返回智能指针避免内存泄漏;基类需有虚析构函数。
- 定义抽象产品基类(含纯虚接口和虚析构)
- 实现多个具体产品类(继承并重写接口)
- 编写工厂类/函数,内部用if-else或switch判断类型,new对应子类,返回std::unique_ptr或std::shared_ptr
示例片段:
class Shape { public: virtual ~Shape() = default; virtual void draw() const = 0; };class Circle : public Shape { void draw() const override { std::cout
class Rectangle : public Sh
ape { void draw() const override { std::cout std::unique_ptr
工厂方法模式(GoF标准)
定义一个创建对象的虚函数(工厂方法),由子类决定实例化哪个类。适用于产品族扩展频繁、需要支持多种产品系列的场景。
关键点:工厂基类声明纯虚工厂方法;每个具体工厂子类实现该方法,返回对应具体产品。
- 抽象工厂类(Creator)含纯虚createProduct(),返回抽象产品指针
- 具体工厂类(如WindowsFactory、MacFactory)重写createProduct(),返回各自平台的具体控件(Button、TextBox等)
- 客户端只依赖抽象工厂和抽象产品,运行时传入具体工厂实例
好处是新增产品系列只需加新工厂子类,不修改现有代码,符合开闭原则。
使用现代C++增强可维护性
避免裸new,统一用std::make_unique或std::make_shared;用enum class替代字符串参数提升类型安全;结合模板工厂减少重复代码(如template
若产品构造参数复杂,可配合Builder模式预配置对象再交由工厂组装。
注意常见陷阱
工厂类本身不应承担业务逻辑,只专注创建;避免工厂方法中出现多重条件嵌套,可考虑用映射表(std::map<:string creatorfunc>)替代硬编码分支;多线程环境*意工厂函数的线程安全性,必要时加锁或使用线程局部存储。
# go
# c++
# switch
# red
# if
# 封装
# 子类
# 析构函数
# const
# void
# 指针
# 继承
# 接口
# class
# public
# 对象
# default
# 重写
# 多个
# 只需
# 适用于
# 不应
# 移到
# 多线程
# 不关心
# 移至
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何解决hover在ie6中的兼容性问题
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
如何快速搭建支持数据库操作的智能建站平台?
如何用5美元大硬盘VPS安全高效搭建个人网站?
如何获取PHP WAP自助建站系统源码?
如何安全更换建站之星模板并保留数据?
1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤
Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】
如何利用DOS批处理实现定时关机操作详解
佛山网站制作系统,佛山企业变更地址网上办理步骤?
网页设计与网站制作内容,怎样注册网站?
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
如何用JavaScript实现文本编辑器_光标和选区怎么处理
Laravel怎么自定义错误页面_Laravel修改404和500页面模板
html5audio标签播放结束怎么触发事件_onended回调方法【教程】
js实现获取鼠标当前的位置
LinuxCD持续部署教程_自动发布与回滚机制
Laravel如何使用Blade组件和插槽?(Component代码示例)
EditPlus中的正则表达式 实战(2)
HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】
Laravel怎么实现模型属性的自动加密
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
如何在橙子建站上传落地页?操作指南详解
用v-html解决Vue.js渲染中html标签不被解析的问题
Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】
百度浏览器网页无法复制文字怎么办 百度浏览器复制修复
简单实现Android文件上传
网易LOFTER官网链接 老福特网页版登录地址
Android okhttputils现在进度显示实例代码
Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
网站图片在线制作软件,怎么在图片上做链接?
Claude怎样写约束型提示词_Claude约束提示词写法【教程】
如何在阿里云虚拟主机上快速搭建个人网站?
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
如何在Windows服务器上快速搭建网站?
深圳网站制作培训,深圳哪些招聘网站比较好?
Laravel如何从数据库删除数据_Laravel destroy和delete方法区别
node.js报错:Cannot find module 'ejs'的解决办法
javascript如何操作浏览器历史记录_怎样实现无刷新导航
详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南
如何实现建站之星域名转发设置?
Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
黑客如何通过漏洞一步步攻陷网站服务器?
如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】
进行网站优化必须要坚持的四大原则
如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
电商网站制作价格怎么算,网上拍卖流程以及规则?

