00:02
建造者模式在JDK应用的源码分析看一下。首先我们看一下同学们,那么在我们JDK里面呢,大家。都用过一个叫BU的。这么一个类用过吗?OK,那么stringbu。这里面就用到了建造者模式,就用到了建造者模式,好,我们给大家追一下这个源码,我们来给他追一下这个源码,还是老规矩啊,同学们打开这里,我们在JDKS里面呢,我们新建。OK,我们新建一个类。这个呢,我们就取个叫builder。Builder这个建造者模式对不对?写一个主方法我们来看一下,写一段代码来追一追又一个string。Builder我们看一下。Build里面呢,有很多的这个构造器,我们选一个熟悉的传一个字符串进去。比如说hello world。
01:01
没理解同学们,然后呢,我们分配一个变量。我们输出,我们输出这个字走。Out。然后呢,把stream build这个对象输出来,我们运行之好,我们运行完了过后,我们发现这边输出的结果就是hellowood,我们现在主要是来看一下它在整个设计build过程中,它是如何设计的,来同学们我们追一把。那追到这个地方过后呢,我们发现哈,我们发现它上面。有一个stringbu这样的类叫final类,是个final类,这个类里面呢,它继承了,同学们可以看到它继承abstractbu。OK,这一个类是个什么呢?听这个名字大家可以看到它是一个抽象类,我们追到这里面去。OK,我们注意到,诶,我们发现的确它是一个abstract。是一个抽象类,而且这个抽象类我们发现呢,这个抽象类里面其实已经有很多方法了。
02:01
大家注意观察其中。就有我们刚才用到的upend upend的地方很多,看到没有upend。大家应该经常用吧,就是追加,追加一个字符串。那他是到底这个obstra build是不是一个是不是我们的。这个抽象建造者呢,其实他不是,他不是,为什么说不是呢?大家看他这边还有个接口。Append appendable,我们到这里面去,我们发现这里边这个是个接口,大家看这个接口里面还有end呢。所以说其实这个我们可以理解成他是他是一个抽象的建造者,由谁呢?由abstract来实现,因为在这个里边大家有发现啊,虽然它是一个抽象类,但是你们发现它很多方法其实已经实现了,你比如说open string。我们找一下啊,我们找一下string。
03:02
在哪里?A string在这。我们发现这个方法其实他已经实现了,对不对,那不是一个抽象方法,但是像这个下面一系列都不是抽象方法。那么那怎么理解,那有些同学说了,说老师,那我们怎么理解,呃,这个string builder里边它的建造者,他的产品。他的指挥者是谁呢?所以说我在这里要阐述一个观点,同学们,我们再去查看源码的时候,注意听这句话啊,我们再去查看源码的时候,有可能有可能你在查源码的时候,你会发现。他在使用的时候,它的它这个它的这个设计模式的思想很相似,但是形式上呢,不完全跟我们画的这个类图保持完全的一致,比如说你如说诶老师这里面他为什么。呃,在在这里面我们找的时候没有没有非常准确的找到他的产品,他的house builder,他的具体的这一个建造者是谁,我说了,因为我们在源码里面用的时候呢。
04:12
这个设计在使用源码去用这个模式的时候,其实我们使用者他并不并不一定知道他已经用了这个这个这个建造者模式,因此他从形式上体现出来呢,跟我们。跟我们实际的这个标准的这个设计模式会略有差别。略有差别,那不管怎么样,我们还是要分析一下他的角色到底有哪些,那么分析同学们有助于观察到,在刚才这个过程中,其实我们已经出现了一些核心的。已经出现了一些核心的这个角色,我们来看一下,那刚才看到我们在尊build里边。他有abstract string build。看到没有?在OB里面呢,有openend这个接口。
05:01
已经出现了三个,那他们的角色分别是什么呢?我给大家梳理一下。那源码中建造者模式的分析,我们首先看第一个,同学们看到刚才有个append。就这个。同学们,看到这个end。这个呢?我写到这儿啊,诶。这个open呢,这个接口它定义了。它定义了什么呢?定义了多个的方法。是不是这样子的,这些方法是不是都抽象的呀,所以说这些方法都是抽象方法。它是抽象方法没问题吧,所以说即即这个open able呢,其实它就是,它就是什么呢?他就为我们抽象建造者。他就是一个抽象建造者了,明白我意思吧,因为他定义了什么呢?他定义了建造方法。
06:00
他定义了前,他定义了些,他定义了我们的一些抽象方法。抽象方法,OK,所以说endable其实就已经是个建造者了,抽象建造者,那么我们接着继续往下分析,我们说有这个建造者肯定就会有具体的。这个建造就是那个建造者具体的时间内,那哪一个是呢?同学们可以看到,我们在这分析的过程中,我们发现里面有一个abstract。BU。大家有发现它虽然叫抽象的时尊build,但实际上他已经把这个接口里面方法实现了,所以说对于这个角色的定位应该怎么去分析呢?就是它呀,这个它实现了我们这个。什么呀,这个接口的方法。接口的方法,因此这里的这个t build呢?在这个位置啊,他其实已经,他已经是一个什么呢,已经是一个建造者了。
07:05
他已经是建造建造的,只是不能实例化。不能是理化。因为他是个抽象的,但是人家在讲这个建造者的时候模式的时候,我刚才一定要听老师讲这句话啊,就这个模式是后面提出来的,有可能这个有可能就是在JDK源码写的时候,人家都人家就还不知道有这样的,你你说的这个这个所谓的什么建造者模式,只是这个这个写JDK的这个哥们技术太牛了,他在无形中有意无意的就已经使到这种模式了,只是他不知道而已。所以他不一定是个很标准的明白吧。明白我的意思吧,好,我们再来分题,第三个build是不是又出现了build这个嘞?这个类是不是他又继承了abstract build?那怎么来分析他的处理角色呢?Builder其实他既。既充当了这个指挥者。
08:01
指挥者模式啊,指挥者这个角角色。角色,但同时呢,他又充当了什么呀?他又充当了具体的一个建造者。建造者模式。那有说老是,嗯,为什么呢?大家有发现啊,我们讲到这,我们我们提一嘴,大家有没有发现在string builder里面,它继承了objectstract里面,它也有个open的string。大家有发现它是override,它over override谁的呀?他重写了它的父类的open的方法,但是它所谓重写其实就是它,它是调用了负类的openend,这个负类的openend其实大家有发现,就是同学们刚才看到的obtra s里面的openend的方法。那换言之,其实它掉了一下过,把这个Z返回。所以说我们说这个家伙比他也是一个具体的建造者,明白我的意思吧,他他是一个指挥者,同时他又是个具体建造者。
09:00
哎,OK,那么。建造方法,它的这个建造方法干什么呢的。的实现。的实现。是由。是。这样写啊。是干什么呢?是由我们的这个obstract。由这个来完成的。是不是就是我我重写了,但是实际上真正的这个open的方法是他来做的,我们来分析这个地方。而什么呢?而我们的。注意听。而。这这个啊,而我们build。而我们tribu只是继承了,继承了什呢?继承了这个obtra obstrabu,因此我们说ribu呢,他既是一个指挥者,同时也是个建造者。同时也是走,所以说我们在这里面阐述这个观点,大家一定要认真的听,就说我们在分析这个源码的时候,你可能发现,诶,好像跟老师讲的标准的这个设计模式不太一样,这是有可能的。
10:04
有可能的,因为你要写源码的时候,首先你提出这个模式。时间是在后面提出的,人家在写DJDK的时候,可能还没有人,还没有人明确的在这个行行业里面还没有人说设计模式,而且人家在写这个设计模式的时候,建建造者设计模式的时候,是你这样认为的。但不同的人对这个建造者模式可能有自己不一样的这个实现方式嘛,只是思想肯定是大同小异,你看他也有一个抽象方法,OB也实现了这个方法,然后build里面又用到了,诶,还是体现出建造者模式的精髓。大家理解我在说什么好,OK,那同学们,那关于建造者模式在JDK源码的应用呢,我们就分析到这里,应该说还是比较好理解的,对吧?我这里也写了这样一个流程,也第8UG的源码。Debug里面码好,那关于这块我们就先聊到这里。
我来说两句