设计模式深入浅出--3.简单工厂模式和工厂方法及它们各自在jdk源码中的体现

简单工厂

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

类型:创建型,但不属于 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

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

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值