工厂模式(Factory Pattern)

工厂模式 是  为了  解决对象的创建问题,封装实例化 的逻辑。   关注点是  如何创建对象

一.工厂模式简介

工厂模式(Factory Pattern)是一种创建型设计模式,它提供一个创建对象的接口,但由子类决定要实例化的类是哪一个。换句话说,工厂模式把对象的创建过程封装起来,使客户端代码与具体实现解耦。

优点

  1. 解耦客户端与具体类:客户端不需要知道具体类名,只需通过工厂获取对象。

  2. 提高扩展性:增加新产品类时,只需增加对应工厂即可,客户端代码无需修改。

  3. 集中管理对象创建:便于维护和修改对象创建逻辑。

缺点

  1. 增加类的数量:每增加一个产品就可能需要增加一个工厂类。

  2. 工厂模式对系统增加新产品的灵活性较高,但增加新产品会增加工厂类的复杂度。

适用场景

  • 当创建对象的逻辑复杂,需要封装起来时。

  • 当客户端只需要通过接口或抽象类使用对象,而不关心具体实现时。

  • 当系统需要将对象的创建与使用分离时。

二.工厂模式实现

假设我们有不同形状的类(Circle、Rectangle),希望通过工厂统一创建对象。

#include <iostream>
#include <memory>

// 1. 抽象产品类
class Shape {
public:
    virtual void draw() = 0;
    virtual ~Shape() {}
};

// 2. 具体产品类
class Circle : public Shape {
public:
    void draw() override {
        std::cout << "Draw Circle" << std::endl;
    }
};

class Rectangle : public Shape {
public:
    void draw() override {
        std::cout << "Draw Rectangle" << std::endl;
    }
};

// 3. 工厂类
class ShapeFactory {
public:
    enum ShapeType { CIRCLE, RECTANGLE };

    static std::unique_ptr<Shape> createShape(ShapeType type) {
        switch (type) {
            case CIRCLE:
                return std::make_unique<Circle>();
            case RECTANGLE:
                return std::make_unique<Rectangle>();
            default:
                return nullptr;
        }
    }
};

// 4. 客户端代码
int main() {
    auto circle = ShapeFactory::createShape(ShapeFactory::CIRCLE);
    circle->draw();

    auto rectangle = ShapeFactory::createShape(ShapeFactory::RECTANGLE);
    rectangle->draw();

    return 0;
}

说明

  • Shape 是抽象产品类。

  • CircleRectangle 是具体产品类。

  • ShapeFactory 提供一个静态方法 createShape 来创建不同类型的对象。

  • 客户端只需要知道工厂和抽象产品类即可,不需要关心具体实现。

三.总结:

  • 工厂类  就是一个 “统一的入口”,负责创建对象,不让客户端直接去 new 具体类。

  • 具体类型的选择 通常是根据客户端提供的信息(比如枚举、字符串、参数等)来决定创建哪种具体对象。

  • 客户端只依赖抽象类或接口,不知道也不需要知道具体实现类,从而实现解耦

所以工厂模式的核心就是:封装对象创建逻辑 + 根据输入动态选择具体类型

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值