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 】
相关推荐:
python中快速进行多个字符替换的方法小结
PythonWeb开发入门教程_Flask快速构建Web应用
微信小程序 require机制详解及实例代码
今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
如何基于云服务器快速搭建个人网站?
Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID
MySQL查询结果复制到新表的方法(更新、插入)
Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程
如何用PHP快速搭建CMS系统?
Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
如何确保西部建站助手FTP传输的安全性?
如何快速搭建二级域名独立网站?
如何在自有机房高效搭建专业网站?
开心动漫网站制作软件下载,十分开心动画为何停播?
潮流网站制作头像软件下载,适合母子的网名有哪些?
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
高防服务器如何保障网站安全无虞?
如何快速启动建站代理加盟业务?
Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理
Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】
海南网站制作公司有哪些,海口网是哪家的?
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
长沙做网站要多少钱,长沙国安网络怎么样?
使用C语言编写圣诞表白程序
Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】
如何在IIS中新建站点并配置端口与IP地址?
Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】
英语简历制作免费网站推荐,如何将简历翻译成英文?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
JavaScript如何实现类型判断_typeof和instanceof有什么区别
魔方云NAT建站如何实现端口转发?
如何登录建站主机?访问步骤全解析
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
如何使用 jQuery 正确渲染 Instagram 风格的标签列表
Laravel如何生成和使用数据填充?(Seeder和Factory示例)
如何用AWS免费套餐快速搭建高效网站?
Bootstrap整体框架之JavaScript插件架构
详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
Python函数文档自动校验_规范解析【教程】
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
打开php文件提示内存不足_怎么调整php内存限制【解决方案】
Android GridView 滑动条设置一直显示状态(推荐)
bootstrap日历插件datetimepicker使用方法
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧
如何快速搭建安全的FTP站点?
如何快速生成凡客建站的专业级图册?

