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


相关推荐: 如何解决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 &#39;ejs&#39;的解决办法  javascript如何操作浏览器历史记录_怎样实现无刷新导航  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  如何实现建站之星域名转发设置?  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  黑客如何通过漏洞一步步攻陷网站服务器?  如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】  进行网站优化必须要坚持的四大原则  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  电商网站制作价格怎么算,网上拍卖流程以及规则?