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

C++智能指针工厂模式 返回shared_ptr工厂方法

P粉602998670
发布: 2025-08-21 11:58:01
原创
425人浏览过
工厂方法返回 shared_ptr 以实现安全的对象生命周期管理,适用于多组件共享对象、跨模块传递或避免手动 delete 的场景;通过 std::make_shared 创建对象可提升性能与异常安全,结合注册表支持动态扩展,但需注意循环引用和线程安全问题。

c++智能指针工厂模式 返回shared_ptr工厂方法

在C++中,结合智能指针与工厂模式是一种常见且推荐的做法,尤其当需要动态创建对象并管理其生命周期时。使用

std::shared_ptr
登录后复制
作为工厂方法的返回类型,可以自动管理对象的内存,避免资源泄漏,同时提高代码的安全性和可维护性。

为什么工厂方法返回 shared_ptr?

工厂模式用于封装对象的创建过程。返回

std::shared_ptr
登录后复制
而不是原始指针或
std::unique_ptr
登录后复制
,主要适用于以下场景:

  • 多个组件可能共享同一个对象实例,需要引用计数来管理生命周期。
  • 对象可能被放入容器、传递给回调、或跨模块使用,
    shared_ptr
    登录后复制
    提供灵活的所有权管理。
  • 避免用户手动调用
    delete
    登录后复制
    ,防止内存泄漏。

基本实现示例

假设我们有一个基类

Product
登录后复制
和多个派生类,通过工厂创建具体对象:

#include <memory>
#include <string>
#include <map>

class Product {
public:
    virtual ~Product() = default;
    virtual void use() const = 0;
};

class ConcreteProductA : public Product {
public:
    void use() const override {
        std::cout << "Using Product A\n";
    }
};

class ConcreteProductB : public Product {
public:
    void use() const override {
        std::cout << "Using Product B\n";
    }
};

class ProductFactory {
public:
    enum class Type {
        A,
        B
    };

    <strong>static std::shared_ptr<Product> create(Type type)</strong> {
        switch (type) {
            case Type::A:
                return std::make_shared<ConcreteProductA>();
            case Type::B:
                return std::make_shared<ConcreteProductB>();
            default:
                return nullptr;
        }
    }
};
登录后复制

使用方式:

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

天工
天工

昆仑万维推出的通用AI智能体平台,原天工AI

天工 212
查看详情 天工
auto product = ProductFactory::create(ProductFactory::Type::A);
if (product) {
    product->use();
}
登录后复制

支持扩展的工厂设计

为了支持运行时注册新类型,可以使用映射表注册构造函数:

class ExtensibleFactory {
    using Creator = std::function<std::shared_ptr<Product>()>;
    std::map<std::string, Creator> creators;

public:
    <strong>void registerCreator(const std::string& name, Creator creator)</strong> {
        creators[name] = creator;
    }

    <strong>std::shared_ptr<Product> create(const std::string& name)</strong> {
        auto it = creators.find(name);
        return it != creators.end() ? it->second() : nullptr;
    }
};
登录后复制

注册和使用:

ExtensibleFactory factory;
factory.registerCreator("A", []() { return std::make_shared<ConcreteProductA>(); });
factory.registerCreator("B", []() { return std::make_shared<ConcreteProductB>(); });

auto product = factory.create("A");
if (product) product->use();
登录后复制

注意事项

使用

shared_ptr
登录后复制
工厂时需注意:

  • 避免循环引用,必要时使用
    std::weak_ptr
    登录后复制
  • 如果对象不应被共享,考虑返回
    std::unique_ptr
    登录后复制
    更合适。
  • 在多线程环境下注册或调用工厂方法时,需对注册表加锁保护。
  • 尽量使用
    std::make_shared
    登录后复制
    而非
    new
    登录后复制
    ,提升性能并确保异常安全。

基本上就这些。返回

shared_ptr
登录后复制
的工厂方法是现代C++中管理动态对象生命周期的推荐方式,既安全又灵活。

以上就是C++智能指针工厂模式 返回shared_ptr工厂方法的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源: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号