工厂模式通过解耦对象创建提升代码灵活性,c++中可用基类指针与多态实现:1. 简单工厂根据参数创建具体产品;2. 工厂方法将创建延迟到子类;3. 抽象工厂用于创建相关对象族;4. 结合智能指针优化内存管理,避免泄漏。

工厂模式是一种创建型设计模式,用来解耦对象的创建过程。在C++中,通过基类指针和多态机制可以很好地实现工厂模式,使程序更灵活、易于扩展。
1. 简单工厂模式(Simple Factory)
简单工厂不是严格意义上的设计模式,但它是理解工厂概念的良好起点。它通过一个工厂类根据传入的参数决定创建哪一种具体产品。
假设我们有一个图形绘制程序,需要创建不同的图形对象:
// 图形基类
class Shape {
public:
virtual void draw() = 0;
virtual ~Shape() {}
};
// 具体图形类
class Circle : public Shape {
public:
void draw() override {
// 绘制圆形
}
};
class Rectangle : public Shape {
public:
void draw() override {
// 绘制矩形
}
};
// 工厂类
class ShapeFactory {
public:
enum ShapeType { CIRCLE, RECTANGLE };
Static Shape* createShape(ShapeType type) {
switch (type) {
case CIRCLE:
return new Circle();
case RECTANGLE:
return new Rectangle();
default:
return nullptr;
}
}
};
使用方式:
立即学习“C++免费学习笔记(深入)”;
Shape* shape = ShapeFactory::createShape(ShapeFactory::CIRCLE);
shape->draw();
delete shape;
2. 工厂方法模式(Factory Method)
工厂方法模式将对象的创建延迟到子类。每个具体工厂负责创建对应的具体产品,符合开闭原则。
定义抽象工厂接口:
class ShapeFactory {
public:
virtual Shape* createShape() = 0;
virtual ~ShapeFactory() = default;
};
// 具体工厂
class CircleFactory : public ShapeFactory {
public:
Shape* createShape() override {
return new Circle();
}
};
class RectangleFactory : public ShapeFactory {
public:
Shape* createShape() override {
return new Rectangle();
}
};
客户端代码:
ShapeFactory* factory = new CircleFactory();
Shape* shape = factory->createShape();
shape->draw();
delete shape;
delete factory;
3. 抽象工厂模式(Abstract Factory)
当需要创建一组相关或依赖对象时,使用抽象工厂。例如,不同主题下的按钮和文本框。
// 按钮基类
class Button {
public:
virtual void click() = 0;
virtual ~Button() {}
};
class winButton : public Button {
public:
void click() override { / windows风格点击 / }
};
// 文本框基类
class TextBox {
public:
virtual void display() = 0;
virtual ~TextBox() {}
};
class WinTextBox : public TextBox {
public:
void display() override { / Windows风格显示 / }
};
// 抽象工厂
class GUIFactory {
public:
virtual Button createButton() = 0;
virtual TextBox createTextBox() = 0;
virtual ~GUIFactory() = default;
};
// 具体工厂:Windows风格
class WinFactory : public GUIFactory {
public:
Button* createButton() override {
return new WinButton();
}
TextBox* createTextBox() override {
return new WinTextBox();
}
};
4. 使用智能指针优化内存管理
上面的例子使用了裸指针和手动 delete,容易出错。推荐使用智能指针避免内存泄漏。
修改返回类型为 std::unique_ptr:
#include <memory>
using ShapePtr = std::unique_ptr<Shape>;
class ShapeFactory {
public:
virtual ShapePtr createShape() = 0;
virtual ~ShapeFactory() = default;
};
class CircleFactory : public ShapeFactory {
public:
ShapePtr createShape() override {
return std::make_unique<Circle>();
}
};
调用时无需手动释放资源,RaiI 自动处理。
基本上就这些。工厂模式能有效分离对象创建与使用,提升代码可维护性。实际项目中结合配置或注册机制还能实现动态加载。


