c++中工厂模式核心是用静态工厂函数返回智能指针(如std::unique_ptr),基类析构函数需为virtual,避免裸指针和过度抽象;简单工厂适用于单一产品类型,抽象工厂仅用于一族相关产品的协同创建。
工厂模式在 C++ 中的核心实现方式
工厂模式本质是把对象创建逻辑从调用方剥离,交由专门的“工厂”类或函数负责。C++ 中最常用、最轻量的是**静态工厂函数**(返回 std::unique_ptr 或 std::shared_ptr),而非必须定义抽象工厂类——尤其当产品类型不多、继承结构简单时,过度抽象反而增加耦合和编译依赖。
关键点:工厂返回智能指针,而非裸指针;基类析构函数必须为 virtual;工厂内部用 new 或 std::make_unique 构造具体子类。
- 若产品类无状态、可拷贝,也可返回值对象(避免堆分配),但需确保移动语义完备
- 工厂函数通常声明为
static成员或自由函数,不依赖工厂实例状态 - 避免在工厂中做复杂初始化逻辑,那属于产品类自身职责
用 std::unique_ptr 实现简单工厂的典型写法
这是现代 C++ 最推荐的方式:资源自动管理、无内存泄漏风险、语义清晰。假设有一个基类 Shape 和两个派生类 Circle、Rectangle:
class Shape {
public:
virtual ~Shape() = default; // 必须!否则 delete base* 会未定义行为
virtual void draw() const = 0;
};
<p>class Circle : public Shape {
public:
void draw() const override { /<em> ... </em>/ }
};</p><p>class Rectangle : public Shape {
public:
void draw() const override { /<em> ... </em>/ }
};</p><p>// 工厂函数
std::unique_ptr<Shape> createShape(const std::string& type) {
if (type == "circle") return std::make_unique<Circle>();
if (type == "rectangle") return std::make_unique<Rectangle>();
return nullptr; // 或抛出 std::invalid_argument
}
调用方无需关心内存释放:auto s = createShape("circle"); s->draw(); —— 出作用域自动析构。
立即学习“C++免费学习笔记(深入)”;