首页 > 后端开发 > C++ > 正文

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

php中文网
发布: 2025-12-06 16:36:07
原创
545人浏览过
工厂模式在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【源码】的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号