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


工厂模式在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;

    }

    立即学习“C++免费学习笔记(深入)”;

    Freepik Mystic Freepik Mystic

    Freepik Mystic 是一款革命性的AI图像生成器,可以直接生*高清图像

    Freepik Mystic 174 查看详情 Freepik Mystic

    为什么用 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【源码】的详细内容,更多请关注其它相关文章!


# 子类  # 随机数  # 如何实现  # 微软  # 中文网  # 自定义  # 第三方  # c++  # 如何推广营销策划  # seo在线工具怎么找  # 济宁网络seo报价  # 自助网站建设运营公司  # 敦煌网站内推广方案  # 微信推广营销品牌  # 集团网站建设平台有哪些  # 咸宁网站建设德升瑞杰  # 邹城租房网站建设  # 哪里有seo服务厂家  # 而在  # 只需  # 开闭 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 菜鸟裹裹怎样获得取件码_菜鸟裹裹获得取件码步骤  天天漫画2025最新入口 天天漫画永久有效登录入口  C++中std::thread和std::async的区别_C++并发编程与线程与异步任务比较  苹果手机如何清理系统缓存数据 iPhone非越狱清理垃圾文件的技巧【系统优化】  虫虫漫画绿色安全入口_虫虫漫画绿色安全入口安全看漫画  学习通网页版个人登录_学习通网页版个人账户登录入口  《杖剑传说》食谱大全  mysql导入sql文件能分批导入吗_mysql分批次导入大sql文件的实用技巧  b站如何管理订阅_b站订阅标签分类管理  CodeIgniter 3 中基于 MySQL 数据高效生成动态图表教程  2025SNH48年度青春盛典门票价格及购买方式  《深林》冬季章节图文攻略  composer licenses 命令:如何检查项目依赖的许可证?  处理含命名空间的XML文件 Power Query中的高级技巧  京东物流快递破损了怎么办_京东快递破损理赔流程  mysql数据库索引类型有哪些_mysql索引类型解析  电脑双系统如何安装和卸载 Windows和Linux双系统安装教程【详解】  Python项目中的条件导入:解决跨模块依赖问题  利用Flexbox实现图片元素的二维布局:2x2网格排列指南  顺丰官方查单号入口 顺丰快递单号查询官网入口  追剧达人如何发弹幕  大熊猫抓取竹子的“大拇指”其实是什么?蚂蚁庄园课堂今天答案最新11月30日  diskgenius分区工具如何设置Bios启动项  多多买菜门店端app订单查看方法  纯CSS实现自适应宽度与响应式布局的水平按钮组  怎样设置开机后自动运行某个程序_Windows启动文件夹与任务计划【自动化】  《火花chat》搜索好友方法  《sketchbook》选中部分图案移动方法  抖音号升级成企业资质怎么弄?有什么好处?  钉钉任务无法提醒如何处理 钉钉任务提醒优化方法  米侠浏览器插件无法启用怎么办 米侠浏览器扩展兼容性修复  b站怎么用微信登录_b站微信登录方法  realme 10 Pro息屏方案_realme 10 Pro省电策略  《万兴喵影》导出视频方法  J*aScript桌面应用_Electron多进程架构实战  批改网官网首页登录 批改网学生用户登录入口  b站怎么设置动态仅粉丝可见_b站动态粉丝可见设置方法  OpenWeatherMap API:通过城市名称获取天气预报数据指南  qq邮箱格式填写示例 qq邮箱标准填写规范  在VS Code中进行数据科学和机器学习开发  键盘测试软件哪个好_键盘故障检测工具推荐  Sublime怎么自动添加CSS前缀_Sublime安装Autoprefixer插件  oppo手机如何通过下拉通知栏截图_oppo手机通知栏快捷截图方法  c++如何实现一个简单的RPC框架_c++远程过程调用原理与实践  《米姆米姆哈》米姆获取及技能攻略  苹果iPhone14ProMax如何新建AppleID_iPhone14ProMax新建AppleID具体流程  《淘宝联盟》推广自己的店铺方法  原子笔记app误删找回教程  @Team是什么?揭秘团队含义  steam缓存文件在哪儿_steam缓存文件的路径查找方法与结构说明 

 2025-12-06

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.