新闻中心

c++如何实现工厂模式_c++创建型设计模式Factory Method【源码】

2025-12-06
浏览次数:
返回列表
工厂模式在C++中通过封装对象创建过程,避免调用方直接new具体类;Factory Method模式定义创建接口,由子类决定实例化哪个类,包含抽象产品、具体产品、抽象工厂和具体工厂四部分。

c++如何实现工厂模式_c++创建型设计模式factory method【源码】

工厂模式在 C++ 中核心是把对象的创建过程封装起来,让调用方不直接 new 具体类,而是通过统一接口获取对象。Factory Method(工厂方法)属于创建型模式,它定义一个创建对象的接口,但由子类决定实例化哪个类。

基本结构:抽象工厂 + 具体工厂 + 产品族

典型 Factory Method 模式包含四部分:

  • Product(抽象产品):定义产品接口,比如 class Shape { public: virtual void draw() = 0; };
  • ConcreteProduct(具体产品):如 class Circle : public Shape { void draw() override { cout <li> <strong>Creator(抽象工厂)</strong>:声明工厂方法 <code>virtual Product* createProduct() = 0;,不实现具体创建逻辑;
  • ConcreteCreator(具体工厂):重写工厂方法,返回对应具体产品,如
    class CircleFactory : public Creator { Product* createProduct() override { return new Circle; } };</li></ul><H3>一个可运行的最小示例(C++17)</H3><p>下面代码无依赖、可直接编译运行,体现 Factory Method 的解耦本质:</p><font color="#888"><pre class="brush:php;toolbar:false;">
    #include <iostream>
    #include <memory>
    #include <string>
    <p>// 抽象产品
    struct Product {
    virtual ~Product() = default;
    virtual std::string name() const = 0;
    };</p><p>// 具体产品 A
    struct ConcreteProductA : Product {
    std::string name() const override { return "ProductA"; }
    };</p><p>// 具体产品 B
    struct ConcreteProductB : Product {
    std::string name() const override { return "ProductB"; }
    };</p><p>// 抽象工厂(Creator)
    struct Creator {
    // 工厂方法:由子类决定返回哪种产品
    virtual std::unique_ptr<Product> create() = 0;
    virtual ~Creator() = default;
    };</p><p>// 具体工厂 A
    struct CreatorA : Creator {
    std::unique_ptr<Product> create() override {
    return std::make_unique<ConcreteProductA>();
    }
    };</p><p>// 具体工厂 B
    struct CreatorB : Creator {
    std::unique_ptr<Product> create() override {
    return std::make_unique<ConcreteProductB>();
    }
    };</p><p>// 使用示例
    int main() {
    CreatorA factoryA;
    auto p1 = factoryA.create();
    std::cout << p1->name() << '\n'; // 输出:ProductA</p><pre class='brush:php;toolbar:false;'>CreatorB factoryB;
    auto p2 = factoryB.create();
    std::cout << p2->name() << '\n'; // 输出:ProductB
    
    return 0;

    }

    简小派 简小派

    简小派是一款AI原生求职工具,通过简历优化、岗位匹配、项目生成、模拟面试与智能投递,全链路提升求职成功率,帮助普通人更快拿到更好的 offer。

    简小派 123 查看详情 简小派

    为什么用 unique_ptr 而不是 raw pointer?

    现代 C++ 推荐用智能指针管理工厂返回的对象生命周期:

    • 避免手动 delete 导致内存泄漏或重复释放;
    • std::unique_ptr 明确所有权,语义清晰;
    • 若需共享所有权,可用 std::shared_ptr,但要评估是否真需要共享;
    • 工厂方法返回值类型统一为智能指针,调用方无需关心析构细节。

    和简单工厂、抽象工厂的区别要点

    别混淆这几个“工厂”:

    • 简单工厂:不是 GoF 模式,只是一个普通工具类(如 ShapeFactory::create("circle")),违反开闭原则;
    • Factory Method:用继承扩展创建逻辑,新增产品只需加新工厂子类,符合开闭原则;
    • 抽象工厂(Abstract Factory):创建“产品族”,比如同时创建 Button + TextBox(Win 系列 / Mac 系列),比 Factory Method 更高层。

    基本上就这些。Factory Method 的价值不在代码多炫,而在把“变”的创建逻辑隔离到子类,让核心业务代码只依赖抽象——改需求时,往往只动工厂子类,不动主流程。

以上就是c++++如何实现工厂模式_c++创建型设计模式Factory Method【源码】的详细内容,更多请关注其它相关文章!


# 中文网  # 西充网络推广部招聘网站  # 仙桃农业网站推广项目  # 沽源视频号推广营销工具商城  # 百度seo 推广技术  # 流量指数seo优化公式  # 本溪网站推广公司排名  # 银川门户网站推广平台  # 成都购物网站建设文案  # 建设网站哪个平台好用些  # 关键词推广渠道排名  # c++  # 相关文章  # 而在  # 只需  # 开闭  # 运算符  # 有什么区别  # 如何使用  # 如何实现  # 子类 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: QQ邮箱网页版入口 QQ邮箱官方邮箱登录通道  优化Log4j2控制台输出性能:解决异步日志瓶颈  腾讯视频怎么举报不良内容_腾讯视频内容举报流程与违规信息处理方法  优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题  php源码怎么看淘宝客系统_看php源码淘宝客系统技巧  TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法  sublime侧边栏怎么增强功能_SideBarEnhancements for sublime安装与配置  优化大型XML文件解析:基于Python流式处理的内存高效方案  windows10怎么查看硬盘序列号_windows10硬盘id查询命令  Composer如何在生产环境安全地执行composer update  Angular响应式表单:实现提交后表单及按钮的禁用与只读化  深入理解与实现最大堆的Heapify过程:常见错误与修正  在J*a中如何使用Stream.map转换元素_Stream映射操作解析  在Go开发中优雅管理ListenAndServe进程:GoSublime集成方案  Python:递归比较文件夹内容并找出特定类型文件的差异  MongoDB Aggregation:在嵌套对象数组中精确匹配ObjectId  12306选座系统怎么选连座_12306选座多人连坐操作方法  vivo手机参数配置怎么增强信号_vivo手机参数配置信号增强方法  深入理解rpy2中的类型转换:优化Python对象到R矩阵的映射  Win11网速慢怎么解决 Win11网络设置优化解除限速  Golang如何实现状态模式管理对象状态_Golang State模式实现技巧  Win11怎么修改默认浏览器_Windows 11设置Chrome为默认  Django表单提交验证失败后保持字段值不刷新  R星幕后开发视频泄露 包含《GTA6》等多款大作  qq游戏手机版下载安装_qq游戏移动端入口  内存检查:在VS Code中调试C++时的内存视图  没有大陆身份证/银行卡如何实名微信? 亲测有效的几种方法分享  J*aScript数组对象转换:按指定键分组与值收集  期待已久:小米17 Ultra、小米首款NAS本月登场  优化Django表单:提交验证失败后保留用户输入  J*a里如何使用forEach遍历Map_Map遍历方法说明  Python异步编程实践:使用Binance API构建实时交易数据流  Lar*el 8 多关键词数据库搜索优化实践  CSS如何设置hover状态颜色_hover伪类调整背景或文字颜色  反效果?《战地6》免费试玩开启后玩家数不升反降  css子元素高度不一致导致布局错位怎么办_使用align-items:stretch解决高度差异  深入理解Promise链:如何在catch后中断then的执行  苹果手机如何防止被恶意App追踪  京东京造J1和网易云音乐氧气真无线有什么不同_国产电商蓝牙耳机音质对比  J*aScript动态修改指定div内所有a标签样式指南  PyTorch模型训练准确率不提升:诊断与修复常见指标计算错误  蛙漫移动版在线看 蛙漫手机浏览器直达入口  C++如何解决segmentation fault_C++段错误调试与原因分析  J*a应用集成GitHub CLI与API认证指南  大象笔记网页版入口 印象笔记网页版登录入口  韩剧圈正版入口页面_韩剧圈官网登录链接  Lar*el表单中优雅地处理“返回”按钮以规避验证:最佳实践指南  抖音网页版快捷访问 抖音网页版网页版入口操作教程  ExcelARRAYTOTEXT函数怎么自定义分隔符输出数组文本_ARRAYTOTEXT实现动态生成SQL语句  电脑IP地址怎么查 查看本机IP地址的几种方法 

搜索