一、简单工厂
定义:由一个工厂对象决定创建出哪一种产品类的实例
类型:创建型,但不属于GOF23种设计模式
适用场景:工厂类负责创建的对象较少,客户端/应用层,只知道传入工厂类的参数,对于如何创建对象不关心
优点:只需要传入参数就可以获取所需要的对象而不需要知道其细节
缺点:增加新的产品需要修改工厂类的逻辑,违背了ocp
二、工厂方法
简答工厂和工厂方法的区别是,简单工厂没使用抽象类或是接口,工厂是另一个类的使用对象。工厂方法的子类看起来很像简单工厂,简单工厂把全部事情在一个地方处理完了,但是工厂是创建一个框架,让子类去决定要怎么实现,简单工厂只是把对象的创建封装起来,不能变更产品,与工厂方法相比少了些弹性。
工厂方法是解决同一产品等级的业务抽象问题
1、定义:定义一个创建对象的接口,由子类来决实例化哪个类,让类的实例化推迟到子类中进行。
2、类型:创建型
3、适用场景:创建对象需要大量重复的代码,应用层不依赖于产品类实例如何被创建、实现等细节,一个类通过其子类来创建对象,只需要所对应的工厂,无需关心是哪个子类实现。
4、优点
-
用户只需关心产品对应的工厂,无需关心创建细节;
-
加入新的产品也符合OCP,提高可扩展性。
-
能够设计出符合依赖倒置原则(DIP)的结构(Head First p140)
5、缺点
- 类的个数容易过多,增加了复杂度;增加系统的抽象性和理解难度
6、例子
产品:Video
产品子类:JavaVideo、PythonVideo、FEVideo…
创建者(工厂):VideoFactory
工厂子类:JavaVideoFactory、PythonVideoFactory、FEVideoFactory…
通过工厂子类来创建…
三、抽象工厂
1、定义:提供一个接口,能够创建一组相关或者相互依赖的对象。
“抽象工厂允许客户使用抽象的接口来创建一组相关的产品,不需要知道产出的具体产品是什么”
2、类型:创建型
3、适用场景
-
客户端或应用层不依赖于产品类实例是如何被创建、如何被实现的;
-
一系列相关产品对象(同一个产品族)一起使用创建对象需要大量重复的代码;
-
提供一个产品类的库,所有的产品以同样的接口出现,是的客户端或应用层不依赖于具体实现。
由于开闭原则的倾斜性,适用于产品等级结构稳定的!
4、优点
-
具体产品在应用层代码隔离,无需关心创建细节;
-
将一个系列的产品族统一到一起创建。
5、缺点
-
规定了所有可能被创建的产品集合,扩展新产品困难,需要修改抽象工厂的接口;
-
增加系统的抽象性和理解难度
-
开闭原则的倾斜性,对于新增加产品族,只要增加具体产品和工厂,无序修改内部代码,这很好地支持了开闭原则,但是对于新增加产品等级结构,也就是扩展新的产品,需要修改工厂内部代码,甚至修改抽象层的代码,这就违反了开闭原则。
-
产品等级与产品族