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

在C++中,结合智能指针与工厂模式是一种常见且推荐的做法,尤其当需要动态创建对象并管理其生命周期时。使用
std::shared_ptr作为工厂方法的返回类型,可以自动管理对象的内存,避免资源泄漏,同时提高代码的安全性和可维护性。
为什么工厂方法返回 shared_ptr?
工厂模式用于封装对象的创建过程。返回
std::shared_ptr而不是原始指针或
std::unique_ptr,主要适用于以下场景:
- 多个组件可能共享同一个对象实例,需要引用计数来管理生命周期。
- 对象可能被放入容器、传递给回调、或跨模块使用,
shared_ptr
提供灵活的所有权管理。 - 避免用户手动调用
delete
,防止内存泄漏。
基本实现示例
假设我们有一个基类
Product和多个派生类,通过工厂创建具体对象:
#include#include #include
使用方式:
立即学习“C++免费学习笔记(深入)”;
auto product = ProductFactory::create(ProductFactory::Type::A);
if (product) {
product->use();
}
支持扩展的工厂设计
为了支持运行时注册新类型,可以使用映射表注册构造函数:
class ExtensibleFactory {
using Creator = std::function()>;
std::map creators;
public:
void registerCreator(const std::string& name, Creator creator) {
creators[name] = creator;
}
std::shared_ptr create(const std::string& name) {
auto it = creators.find(name);
return it != creators.end() ? it->second() : nullptr;
}
};
注册和使用:
ExtensibleFactory factory;
factory.registerCreator("A", []() { return std::make_shared(); });
factory.registerCreator("B", []() { return std::make_shared(); });
auto product = factory.create("A");
if (product) product->use();
注意事项
使用
shared_ptr工厂时需注意:
- 避免循环引用,必要时使用
std::weak_ptr
。 - 如果对象不应被共享,考虑返回
std::unique_ptr
更合适。 - 在多线程环境下注册或调用工厂方法时,需对注册表加锁保护。
- 尽量使用
std::make_shared
而非new
,提升性能并确保异常安全。
基本上就这些。返回
shared_ptr的工厂方法是现代C++中管理动态对象生命周期的推荐方式,既安全又灵活。










