c++如何实现工厂模式_c++工厂(Factory)设计模式实现方法

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

c++如何实现工厂模式_c++工厂(Factory)设计模式实现方法

工厂模式是一种创建型设计模式,用来解耦对象的创建过程。在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();
    }
};

客户端代码:

c++如何实现工厂模式_c++工厂(Factory)设计模式实现方法

天工大模型

中国首个对标ChatGPT的双千亿级大语言模型

c++如何实现工厂模式_c++工厂(Factory)设计模式实现方法115

查看详情 c++如何实现工厂模式_c++工厂(Factory)设计模式实现方法

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 自动处理。

基本上就这些。工厂模式能有效分离对象创建与使用,提升代码可维护性。实际项目中结合配置或注册机制还能实现动态加载。

上一篇
下一篇
text=ZqhQzanResources