简单工厂 :
定义:由一个工厂对象绝对创建出哪一种产品类的实例
类型:创建型,但不属于 GOF23种设计模式
适用场景 :
工厂类负责创建的对象比较少
客户端(应用层)只知道传入工厂类的参数对于如何创建对象(逻辑)不关心
优点 :
只需要传入一个正确的参数,就可以获取你所需要的对象而无须知道其创建细节
缺点 :
工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,违背开闭原则
coding
创建一个Video抽象类,来实现各种视频的创建。
创建一个JavaVideo类继承Video抽象类
创建pythonVideo类继承Video抽象类
创建应用层Test类
现在就是父类声明的引用指向子类JavaVideo。
现在有一个问题,就是每需要一个课程视频,你就需要去创建一个类,而且还需要引入相关类的包。
解决办法采用简单工厂模式
创建一个VideoFactory类,来创建相应的课程视频类
修改Test类
这样的话我们导入包只需要导入VideoFactory类,不需要导入相关的课程视频类。
当前的UML类图
但是简单工厂也存在一个很严重的问题,就是每次需要一个新的课程视频类的时候就必须在工厂中进行判断,然后创建一个新的课程视频类。这样下去随着项目的不断增加,可维护性和可读性将会非常差。
对于简单工厂还可以通过反射来进行创建。
这种方式从一定程度上满足开闭原则 ,我们要创建相关对象,我们只需要传入相关的class就可以了。
简单工厂在JDK源码中的体现
进入到createCalendar()方法源码 中
我们看它的if判断是不是和简单工厂模式很像
查看calendar的UML类图
工厂方法
定义:定义一个创建对象的接口但让实现这个接口的类来决定实例化哪个类工厂方法让类的实例化推迟到子类中进行;
类型:创建型
使用场景:
创建对象需要大量重复的代码
客户端(应用层)不依赖于产品类实例如何被创建、实现等细节
一个类通过其子类来指定创建哪个对象
优点:
用户只需要关系所需产品对应的工厂,无须关心创建细节
加入新产品符合开闭原则,提高了可扩展性
缺点:
类的个数容易过多,增加复杂度
增加了系统的抽象性和理解难度
coding
创建抽象类VideoFactory
创建Video类
创建一个JavaVideoFactory来继承VideoFactory工厂
创建一个JavaVideoFactory来继承VideoFactory工厂
创建Test类
如果想创建PythonVideoFactory工厂,只需要修改后面的new 对象就可以了。
如果后面我们需要扩展应用,添加FE视频,只需要创建一个FE类就可以了
查看当前UML类图
总结来说:我们调用的时候只是调用抽象类,而真正实现该类创建的是它的子类。
工厂方法在源码中的体现
由于Collection是一个抽象方法,我们可以看它的子类对iterator的实现
可以了解为arraylist就是一个具体的实现工厂
生产的产品是Iterator,具体的产品时Itr,创建了一个具体的实现,然后返回了一个Itr。
总结来说:Collection相当于之前工厂里面的VideoFactory
ArrayList相当于具体实现的工厂相当于JavaVideoFactory和PythonVideoFactory
具体的产品就是ArrayList里面具体的Itr这个类相当于JavaVideoFactory中的具体JavaVideo
继续分析其他的
我们再看一个类URLStreamHandlerFactory
我们查看它唯一一个方法的具体实现