设计模式之工厂模式

工厂模式(Factory Pattern) 是一种创建型设计模式,它提供了一种将对象的创建与使用分离 的方法。工厂模式的主要目的是避免直接使用 new 操作符来创建对象,而是通过工厂类根据具体的需求来决定实例化哪个具体的类。

在 C++ 中,工厂模式通常用于创建某个抽象基类的不同派生类的实例,使得客户端代码不需要知道具体实现类的名称。通过工厂模式,客户端可以灵活地创建不同类型的对象,而无需更改创建逻辑。

工厂模式的关键点:

  1. 抽象基类:定义通用接口,所有派生类必须实现这个接口。
  2. 具体子类:不同的派生类实现不同的功能。
  3. 工厂类:负责根据客户端的需求来创建具体的子类实例。

工厂模式的代码示例:

假设我们有一个简单的场景,创建不同种类的图形对象(如圆形和矩形),并根据不同的需求返回不同类型的图形对象。

1. 抽象基类定义

首先,我们定义一个抽象基类 Shape,表示不同形状的通用接口。

cpp 复制代码
#include <iostream>
#include <memory>

// 抽象基类
class Shape {
public:
    virtual void draw() const = 0;  // 纯虚函数,所有派生类必须实现
    virtual ~Shape() {}             // 虚析构函数
};
2. 具体的派生类

接下来我们定义两个派生类:CircleRectangle,它们分别实现 Shape 接口。

cpp 复制代码
// 派生类:圆形
class Circle : public Shape {
public:
    void draw() const override {
        std::cout << "Drawing a Circle" << std::endl;
    }
};

// 派生类:矩形
class Rectangle : public Shape {
public:
    void draw() const override {
        std::cout << "Drawing a Rectangle" << std::endl;
    }
};
3. 工厂类定义

现在我们定义一个工厂类 ShapeFactory,根据输入的类型创建不同的图形对象。

cpp 复制代码
// 工厂类
class ShapeFactory {
public:
    // 根据传入的类型创建对应的对象
    std::unique_ptr<Shape> createShape(const std::string& shapeType) {
        if (shapeType == "circle") {
            return std::make_unique<Circle>();
        } else if (shapeType == "rectangle") {
            return std::make_unique<Rectangle>();
        } else {
            return nullptr;
        }
    }
};
4. 使用工厂类

客户端代码可以通过工厂类来创建不同类型的图形对象,而无需直接调用构造函数。

cpp 复制代码
int main() {
    ShapeFactory factory;

    // 创建一个圆形对象
    std::unique_ptr<Shape> shape1 = factory.createShape("circle");
    if (shape1) {
        shape1->draw();  // 输出: Drawing a Circle
    }

    // 创建一个矩形对象
    std::unique_ptr<Shape> shape2 = factory.createShape("rectangle");
    if (shape2) {
        shape2->draw();  // 输出: Drawing a Rectangle
    }

    // 创建未知类型的对象
    std::unique_ptr<Shape> shape3 = factory.createShape("triangle");
    if (!shape3) {
        std::cout << "Unknown shape type!" << std::endl;  // 输出: Unknown shape type!
    }

    return 0;
}

代码说明:

  1. Shape :是一个抽象基类,定义了所有图形类的通用接口,即 draw() 方法。
  2. CircleRectangle :是 Shape 的派生类,分别实现了 draw() 方法,提供绘制圆形和矩形的具体实现。
  3. ShapeFactory :是工厂类,它根据传入的字符串(shapeType)来决定创建 Circle 还是 Rectangle 对象。工厂类将对象的创建逻辑封装起来,客户端不需要直接处理对象的构造。
  4. 客户端代码 :通过调用 ShapeFactory::createShape() 来创建不同类型的对象,而不需要了解具体的构造过程。

工厂模式的优点:

  1. 封装对象创建逻辑 :工厂模式将对象的创建封装在工厂类中,客户端不需要关心具体的创建过程,遵循了 单一职责原则
  2. 便于扩展:如果以后需要增加新的形状类型(比如三角形),只需要添加新的派生类,并在工厂中添加处理逻辑,而不需要修改客户端代码。
  3. 解耦客户端和具体实现类:客户端通过工厂类与具体的实现类进行解耦,增加代码的灵活性和可维护性。

工厂模式的使用场景:

  • 需要根据条件或参数动态创建对象,而不是在编译时决定。
  • 创建的对象类型较多,且具有共同的接口或基类。
  • 需要隐藏复杂的对象创建过程,以便简化客户端代码。
相关推荐
汉克老师2 小时前
GESP2026年6月认证C++六级( 第三部分编程题(2、满二叉树))精讲
c++·深度优先·树形dp·满二叉树·gesp六级·树形dfs
我是一颗柠檬2 小时前
【Java项目技术亮点】覆盖索引与索引下推优化
android·java·开发语言
2601_962440842 小时前
计算机毕业设计之健身房管理系统的设计与实现
java·开发语言·课程设计·旅游·宠物
踮起脚看烟花3 小时前
多人聊天室实现v2.0
c++·信息与通信
梦帮科技3 小时前
UE5 GAS 实战:用 Gameplay Ability System 搭建「赛博修真」境界与技能体系
c++·人工智能·python·ue5·c#
旖-旎3 小时前
QT系统篇(5)(下)
开发语言·c++·qt
99乘法口诀万物皆可变3 小时前
PcanToVectorXL_V01:打通 Vector 与 PCAN 的双向 CAN/CAN‑FD 桥梁
c++·学习
摇滚侠3 小时前
方法 A 等方法 B 执行完再执行 叫同步调用还是异步调用 JS 默认是同步调用还是异步调用
开发语言·javascript·ecmascript
liulun3 小时前
C++ WinRT中的事件
开发语言·c++
whitelbwwww3 小时前
c++运行onnx模型
开发语言·c++