2023-02-22
原文作者:键盘林 原文地址:https://blog.csdn.net/qq_37909508/category_8976362.html

简单工厂

定义:由一个工厂对象绝对创建出哪一种产品类的实例

类型:创建型,但不属于 GOF23种设计模式

适用场景

工厂类负责创建的对象比较少

客户端(应用层)只知道传入工厂类的参数对于如何创建对象(逻辑)不关心

优点

只需要传入一个正确的参数,就可以获取你所需要的对象而无须知道其创建细节

缺点

工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,违背开闭原则

coding

创建一个Video抽象类,来实现各种视频的创建。

202302222057535281.png

创建一个JavaVideo类继承Video抽象类

202302222057543782.png

创建pythonVideo类继承Video抽象类

202302222057556213.png

创建应用层Test类

现在就是父类声明的引用指向子类JavaVideo。

202302222057566394.png

现在有一个问题,就是每需要一个课程视频,你就需要去创建一个类,而且还需要引入相关类的包。

解决办法采用简单工厂模式

创建一个VideoFactory类,来创建相应的课程视频类

202302222057575795.png

修改Test类

这样的话我们导入包只需要导入VideoFactory类,不需要导入相关的课程视频类。

202302222057585926.png

当前的UML类图

202302222057597437.png

但是简单工厂也存在一个很严重的问题,就是每次需要一个新的课程视频类的时候就必须在工厂中进行判断,然后创建一个新的课程视频类。这样下去随着项目的不断增加,可维护性和可读性将会非常差。

对于简单工厂还可以通过反射来进行创建。

202302222058008428.png

这种方式从一定程度上满足开闭原则 ,我们要创建相关对象,我们只需要传入相关的class就可以了。

202302222058027289.png

简单工厂在JDK源码中的体现

2023022220580428210.png

进入到createCalendar()方法源码 中

2023022220580563911.png

我们看它的if判断是不是和简单工厂模式很像

2023022220580732812.png

查看calendar的UML类图

2023022220581528413.png

工厂方法

定义:定义一个创建对象的接口但让实现这个接口的类来决定实例化哪个类工厂方法让类的实例化推迟到子类中进行;

类型:创建型

使用场景:

创建对象需要大量重复的代码

客户端(应用层)不依赖于产品类实例如何被创建、实现等细节

一个类通过其子类来指定创建哪个对象

优点:

用户只需要关系所需产品对应的工厂,无须关心创建细节

加入新产品符合开闭原则,提高了可扩展性

缺点:

类的个数容易过多,增加复杂度

增加了系统的抽象性和理解难度

coding

创建抽象类VideoFactory

2023022220581669314.png

创建Video类

2023022220581827815.png

创建一个JavaVideoFactory来继承VideoFactory工厂

2023022220581934316.png

创建一个JavaVideoFactory来继承VideoFactory工厂

2023022220582065817.png

创建Test类

2023022220582214218.png

如果想创建PythonVideoFactory工厂,只需要修改后面的new 对象就可以了。

2023022220582352119.png

如果后面我们需要扩展应用,添加FE视频,只需要创建一个FE类就可以了

2023022220582550120.png

查看当前UML类图

2023022220582660221.png

总结来说:我们调用的时候只是调用抽象类,而真正实现该类创建的是它的子类。

工厂方法在源码中的体现

2023022220582807222.png

2023022220582959823.png

由于Collection是一个抽象方法,我们可以看它的子类对iterator的实现

可以了解为arraylist就是一个具体的实现工厂

2023022220583073024.png

生产的产品是Iterator,具体的产品时Itr,创建了一个具体的实现,然后返回了一个Itr。

2023022220583197625.png

总结来说:Collection相当于之前工厂里面的VideoFactory

ArrayList相当于具体实现的工厂相当于JavaVideoFactory和PythonVideoFactory

具体的产品就是ArrayList里面具体的Itr这个类相当于JavaVideoFactory中的具体JavaVideo

2023022220583382526.png

继续分析其他的

我们再看一个类URLStreamHandlerFactory

2023022220583491927.png

我们查看它唯一一个方法的具体实现

2023022220583626228.png

2023022220583848529.png

2023022220584140130.png

2023022220584299631.png

阅读全文