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 Shape { void draw() const override { std::cout
std::unique_ptr createShape(const std::string& type) { if (type == "circle") return std::make_unique(); else if (type == "rectangle") return std::make_unique(); return nullptr; }

工厂方法模式(GoF标准)

定义一个创建对象的虚函数(工厂方法),由子类决定实例化哪个类。适用于产品族扩展频繁、需要支持多种产品系列的场景。

关键点:工厂基类声明纯虚工厂方法;每个具体工厂子类实现该方法,返回对应具体产品。

  • 抽象工厂类(Creator)含纯虚createProduct(),返回抽象产品指针
  • 具体工厂类(如WindowsFactory、MacFactory)重写createProduct(),返回各自平台的具体控件(Button、TextBox等)
  • 客户端只依赖抽象工厂和抽象产品,运行时传入具体工厂实例

好处是新增产品系列只需加新工厂子类,不修改现有代码,符合开闭原则。

使用现代C++增强可维护性

避免裸new,统一用std::make_unique或std::make_shared;用enum class替代字符串参数提升类型安全;结合模板工厂减少重复代码(如template std::unique_ptr create() { return std::make_unique(); })。

若产品构造参数复杂,可配合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站点?  如何快速生成凡客建站的专业级图册?