【c++设计模式04】创建型2:工厂方法模式(Factory Pattern)
- 一、工厂模式
- 二、简单工厂模式的弊端
- 三、工厂方法模式
- 四、UML类图
- 五、demo
- 六、总结
原创作者:郑同学的笔记
原创地址:https://zhengjunxue.blog.csdn.net/article/details/132305712
qq技术交流群:921273910
类型 | 序号 | 设计模式 | 描述 |
创建型 | 1 | 简单工厂模式 (Simple Factory Pattern) | 通过一个工厂类负责创建所有产品的实例 |
2 | 工厂方法模式 (Factory Pattern) | 将对象的实例化延迟到子类中实现 | |
3 | 抽象工厂模式 (Abstact Factory Pattern) | 通过提供一组相关产品的接口,实现了一系列具体工厂类来创建不同产品族的实例 | |
4 | 单例模式 (Singleton Pattern) | 保证一个类只有一个实例 | |
5 | 创建者模式 (Builder Pattern) | 如何创建一个组合对象 | |
6 | 原型模式 (Prototype Pattern) | 它通过复制已有对象来创建新的实例 |
一、工厂模式
-
工厂模式是一种软件设计模式,它提供了一种创建对象的方式,将对象的实例化和使用分离开来。工厂模式通过定义一个公共的接口或抽象类来创建对象,并由实现该接口或继承该抽象类的具体工厂类负责实例化对象。
-
在工厂模式中,客户端通过调用工厂类的方法来获取所需的对象,而无需直接实例化对象。工厂类根据不同的需求条件,使用不同的逻辑或算法创建相应的对象,隐藏了对象创建的具体细节。
-
工厂模式可以有效地降低系统的耦合度,提高代码的可维护性和可扩展性。它符合面向对象设计原则中的开放封闭原则,即对扩展开放,对修改封闭。当需要新增一种产品时,只需添加相应的具体产品类和对应的工厂类,而无需修改已有的代码。
-
常见的工厂模式包括简单工厂模式、工厂方法模式和抽象工厂模式。
简单工厂模式通过一个工厂类负责创建所有产品的实例;
工厂方法模式将对象的实例化延迟到子类中实现;
抽象工厂模式通过提供一组相关产品的接口,实现了一系列具体工厂类来创建不同产品族的实例。
二、简单工厂模式的弊端
在上一节简单工厂模式中,创建了一个工厂类,用于生产需要的对象,但是这种方式有一个弊端,它违反了设计模式中的开放-封闭原则,
在上面的工厂函数中需要生成2种水果,现在如果想要生成更多,那么就需要在工厂函数的switch语句中添加更多的case,很明显这违背了封闭原则,也就意味着需要基于开放原则来解决这个问题。
使用工厂模式可以很完美的解决上述的问题,简单工厂模式是只有一个工厂类,而工厂模式是有很多的工厂类:
- 一个基类,包含一个虚工厂函数,用于实现多态。
- 多个子类,重写父类的工厂函数。每个子工厂类负责生产一种恶魔果实,这相当于再次解耦,将工厂类的职责再次拆分、细化,如果要生产新品种的恶魔果实,那么只需要添加对应的工厂类,无需修改原有的代码。
三、工厂方法模式
工厂类其实都不复杂,在每个子工厂类中也只是重写了父类的工厂方法而已,每个子工厂类生产一种水果,但是工厂函数的返回值确是水果的基类类型,相当于是使用父类指针指向了子类对象,此处也是用到了多态。通过这样的处理,工厂函数也就不再需要参数了。
四、UML类图
五、demo
在main()函数中的这句代码是实例化了苹果工厂、香蕉工厂的对象:
#include<iostream>
using namespace std;class AbstractFruit {
public:virtual void say() {};virtual ~AbstractFruit() {};
};
class Apple : public AbstractFruit {
public:void say() override{cout << "i am a Apple\n";}
};
class Banana : public AbstractFruit {
public:void say(){cout << "i am a Banana\n";}
};class Factory {
public:virtual AbstractFruit* createFruit() = 0;virtual ~Factory() {};
};class AppleFactory:public Factory {
public:AbstractFruit* createFruit() override{return new Apple;}
};class BananaFactory :public Factory {
public:AbstractFruit* createFruit() override {return new Banana;}
};int main()
{Factory* factory = new AppleFactory();AbstractFruit* obj = factory->createFruit();obj->say();factory = new BananaFactory();obj = factory->createFruit();obj->say();return 0;
}
输出
六、总结
简单工厂模式的优点是易于理解和实现,客户端只需要与工厂类进行交互,而不需要直接与具体产品类打交道。当需要添加新的产品类时,只需要修改工厂类即可,符合开闭原则。缺点是随着产品类的增加,工厂类的代码逻辑会变得越来越复杂,违反了单一职责原则。
总结来说,工厂模式和简单工厂模式都是用于对象的创建,提供了一种封装对象创建过程的方式,使得客户端与具体对象的创建解耦。而简单工厂模式是工厂模式的一种简单形式,适用于对象较少且创建逻辑相对简单的情况。