工厂方法(Factory Method)

概述

工厂方法模式(Factory Method Pattern)是一种常用的创建型设计模式。它通过定义一个创建对象的接口,但是将具体的实例化工作延迟到子类中去完成。这种方式可以使得一个类的实例化延迟到其子类。

设计原理

工厂方法模式主要包含以下几个角色:

  • 抽象产品(Product):定义了产品的抽象接口,可以是一个接口或者抽象类。
  • 具体产品(Concrete Product):实现了抽象产品接口的具体类。
  • 抽象工厂(Creator):定义了一个创建产品对象的抽象方法,返回一个抽象产品类型的对象。
  • 具体工厂(Concrete Creator):实现了抽象工厂中的抽象方法,返回一个具体产品类型的对象。

优缺点

1、优点

  • 松耦合:客户端代码只需要知道抽象工厂和抽象产品,不需要关心具体的实现类,从而减少了对象之间的耦合度。
  • 可扩展性:添加新的产品类只需要扩展具体产品和具体工厂,而不需要修改客户端代码。
  • 符合开闭原则:对扩展开放,对修改关闭。

2、缺点

  • 类的数量增加:使用工厂方法模式会增加代码的数量,因为需要为每个产品类都创建一个对应的工厂类。
  • 增加了复杂度:当产品类较多时,工厂类的数量也会增加,增加了系统的复杂度。

应用示例

假设我们有一个简单的图形库,需要创建不同类型的图形对象,比如圆形和矩形。我们可以使用工厂方法模式来实现。

首先,我们定义抽象产品类 Shape:

class Shape {
public:
    virtual void draw() = 0;
    virtual ~Shape() {}
};

然后,我们定义具体产品类 Circle 和 Rectangle:

class Circle : public Shape {
public:
    void draw() override {
        std::cout << "Drawing Circle\n";
    }
};

class Rectangle : public Shape {
public:
    void draw() override {
        std::cout << "Drawing Rectangle\n";
    }
};

接着,我们定义抽象工厂类 ShapeFactory:

class ShapeFactory {
public:
    virtual Shape* createShape() = 0;
    virtual ~ShapeFactory() {}
};

最后,我们定义具体工厂类 CircleFactory 和 RectangleFactory:

class CircleFactory : public ShapeFactory {
public:
    Shape* createShape() override {
        return new Circle();
    }
};

class RectangleFactory : public ShapeFactory {
public:
    Shape* createShape() override {
        return new Rectangle();
    }
};

现在我们可以使用工厂方法来创建图形对象:

int main() {
    ShapeFactory* circleFactory = new CircleFactory();
    Shape* circle = circleFactory->createShape();
    circle->draw();
    
    ShapeFactory* rectangleFactory = new RectangleFactory();
    Shape* rectangle = rectangleFactory->createShape();
    rectangle->draw();

    delete circle;
    delete circleFactory;
    delete rectangle;
    delete rectangleFactory;

    return 0;
}

与抽象工厂模式对比

工厂方法模式:关注的是一个产品等级结构,即每个工厂只负责创建一个具体产品,但是可能有多个不同类型的具体工厂。适用于一个产品等级结构,但是可能有多个不同类型的具体工厂,且新增产品时对已有代码影响较小的情况

抽象工厂模式:关注的是多个产品等级结构,即每个工厂可以创建一组相关的产品,且通常一个抽象工厂对应一个产品族,而不是单一的产品。适用于多个产品等级结构,且每个等级结构有多个产品组成,同时需要保证产品之间的兼容性,例如 GUI 工具包的开发中,不同操作系统下的按钮、文本框等。

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

复杂的世界311

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值