00:01
看一下建造者模式解决盖房的这么一个应用实力,首先盖房子的过程,刚才我们已经给大家讲过了,打桩、砌墙封顶,对不对?那现在我们用建造者模式来解决的话呢,首先第一步我们仍然是画出对应的类图,好吧,来,各位同学,打开我们的eclipse。打开eclipse,那这里呢,我们是对前面这个案例的改进,因此呢,我写一个包包叫improve。Improve。OK,好,同样我们在这里呢,新建一个类图。对吧,新建一个类图。在这里面新建一个类图。好,那今天这个类图呢,我们来画一下,呃,这个类图的设计,首先我们刚才讲过,首先应该有个产品叫house。这个没问题吧,比如说耗时呢,就是我们的产品就是相当于我们建造者模式里面的product。Product我写到这里,这干什么呢?House就是产品,这就是我们的产品。
01:04
对,把它进行一个关联。大家都知道house有了过后呢,我们是不是按照原先的设计,应该有一个builder是吧?有个builder,那builder是个抽象类,我们写到这来,我们起个名字叫做house builder。House build没问题吧,House build,那house builder里面,呃,我们我们刚才讲过这个house呢,会被组合到这里面去,因此呢,我这有一个这样一个东西,就是比如说house。对,House它的类型,House因为是组合,所以说我直接溜出来就可以了,House。OK,好,同学们可以看到他们之间的关系呢,就比较明确了,就是我们这个产品和我们这个builder呢,是一个什么什么样的关系啊,同学们是一个组合的关系。没问题吧,那紧接着这里面house里面是不是有相应的这些方法呀,方法是不是就是我们规定好的这些方法来走,第一个方法前面老师已经讲过,第一个是我们打地基,所以说就应该是Bill的basic。
02:10
Basic没问题吧,第二一个步骤大家还记不记得,第二个步骤就是我们的干什么呢?就是砌墙be的。没问题吧,我还有第三一个步骤,同学们,第三一个步骤呢,就是我们的封顶roof。ROE。在下一个步骤,根据我们前面讲的,他应该返回一个结果是不是,所以说我们这边呢,会有一个返回结果的方法,比如叫get result或者叫build也行啊,这都是样反build,它到时候会返回一个什么呢?返回一个house。没问题吧,好,大体就这样子的。呃,那么呃,画着这个build完了,这个build是个抽象的,所以说他需要由我们实际去。具体的这个叫做builder,那现在呢,我们写些类来做具体的,那就是他们。
03:06
Common。这就是具体的建造者,也叫对应到我们这个图的话,这个common house就是对应我们哪一个图能对应我们这个concrete builder能能理解哈,那现在呃,除了这种房子,我们是不是还有别的呀,还有高楼high build。B building,哦,我简写哈,啊,还有别墅我就不写了,那他们之间呢,是一个什么样的关系呢?是一个泛化的关系,继继承他。没问题吧,同学们,那紧接着我们还需要一个指挥者,指挥者就是我们的这个director,那我写个叫house director。那么他们之间的关系是什么样关系呢?刚才我们讲过,在这个指挥者里面呢,它会有一个属性。这个属性它是什么呢?它会拥有一个builder。
04:00
啊,拥有一个builder,所以说我们在这写个叫house。AB。那行。内心。哦,这个这个地方是。小写的对吧,那是小写的对,当然类型呢,就是我们hospital。B。BOK。往这边挪一下啊,这个有点不够画了。那这边是个什么呢?就是说实际上这是个抽象类,它是不可能有具体的一个实例的,其实我们这样子组合主要是用的它下面的就是通过我们这个抽象类跟我们的具体的是,呃,这个构建者发生一个依赖,所以这个图能这样话也是没问题的,那他们之间是一个什么呀,聚合的关系。聚合的关系。OK,同学们,那最后我们还需要一个客户端来调用,对不对,那这边有个client。客户端来调用谁呢?客户端只需要去使用这个house builder就可以了,到house builder里面,呃,当然house builder做的时候呢,肯定我们也会把,比如说呃,我们要给他传进去,肯定这个呃这个兰还会依赖到common house或者是依赖到。
05:16
我们的high building。是不是这样道理,这就是他们的一个什么呀。就是构建者模式。对应的这么一个类图,大家看能不能理解。啊,并不难,对不对,并不难,好的,有了这样一个一个图构,下面代码就其实比较简单,我们来一起把这个代码给大家走一遍,走一遍来走一个,首先我们按照这个顺序来先写房子。房子就是产品,里面就不会再有具体的构建过程了。来吧,那第一个呢,我们看看里面需要哪些数属性啊,Private首先它有地基。没问题吧,这我就快速写,他还有什么呢?他还有墙。是不是一个房子嘛,作为一个产品,它有的一些要素,我们还是有,它应该有个屋顶。
06:06
啊,有个屋顶,这个屋顶呢,我们也写成string类型的十个亿。十个亿。好的,然后我们把他的这个一堆这个get set方法给他就可以了。因为当时我们,呃,它是有这几个部分构成的,所以说把get set方法给他,这个就是我们什么呢?这个就是我们的产品。产品OK,它对应我们哪个角色呢?Product。Product,没对吧,同学们,好的,那紧接着我们要写他的。Builder builder builder是个抽象类,对不对?把它勾上,那我们现在先写这个build叫house。Builder build builder,它是个抽象的。那这个抽象里面,我们说建造者他主要是要干什么呢?把这个建造的流程给我们写清楚,所以说在这里呢,这个就对应什么啊写一下这个就是一个抽象。
07:04
的建造者。OK,那么现在呢,这里面我们需要第一个,我们要组合一个。他要组合一个成员的属性,就是那个house,刚才我们是讲过六一个house。OK。那现在呢,我们要把这些方法写起来,就是它这里面有具体的过程。将制作或者叫建造,建造的流程写好。那这里面这个方法呢,肯定是抽象的啊,抽象的方法,因为具体的这个建造流程是由它的子类来实现的,那现在我就写public。Obstract。Abstract,然后VO Bill的什么呀,BA basic。BA。没问题啊,同学们,Basic好的。那下面我们就依此类推哈,复制一份。
08:02
而下一个是build什么呀,Build我们的。What?是不是盖呃,砌墙啊,再下一个。该什么呀,Build我们的,呃,屋顶就是该屋顶了。那就比较build的屋顶呢,就直接RO。Roof,好吧,这是打地基,这是砌墙,这是。干嘛盖房顶,那最后你做完了过后是不是造房子要把这个房子给做回去啊,就是。使用前面这个流程呢建房。建建造房子。那建造房子呢?我们直接把这个建造好的房子返回去,是不是刚才讲过这个我们叫build house。我在我在这个类图里面写的是build,这写成build house没什么问题啊,没什么问题,那直接就干什么呢?我们在这个地方进行一个处理过后,进行一个处理过后,你这个建造的流程,你们自己下面可以组合,我这呢相当于把这个房子盖好了以后就返回这个耗时。
09:07
啊,也就是说房子建造房子好后,好后将将这个产品。这个产品其实就是我们的房子了。干什么呢,返回。OK,大家看这个能否能否理解,能否理解好的,那这个流程整完了过后,下边下面同学们。呃,其实我们也可以写一个build啊,这个我就不写了,其实也可以组合,呃,就看你自己的需求吧,呃,有些房子可能建造流程有些不一样的地方,你也可以把它组合,你也可以不组合。主要是里面的代码要写清楚就可以了。好,现在我们来写哪一个了呢?现在我们把这块写好了,就是这个写好了,这个也写好了。我们再写一个具体的建造者。具体验收者呢,我们来先写一个来跟我的思路哈,Common common。
10:00
Common,那common显然他是要去继承我们这个house build的。那这里面呢,有三个方法是吧,同学们有三个方法要去实现,好,我们来写一写。比如说这个是给。给这个普通房子盖房子,那就我就写普通房,普通房子打地基打。地基几米呢?比如说五米。啊,我们打五米就可以了。普通房子不需要打太深嘛,好,第二个呢,它是砌墙,我们这写个砌墙,比如说砌砌墙是十厘米,普通房子砌墙。砌墙多少呢?比如说十个厘米就可以了。那下面这个盖屋顶,我们这写个普通房子呢,盖的就是一个普通房子的屋顶。屋顶。OK。好。经过这样子呢,我们就把前面的方法给写完了,就是说大家有没有发现我们把这个普通房子,它的建造过程是写在。
11:06
它的子类里面的。但产品本身的属性是封装在这个house里面的,所以说把流程制造的流程和产品本身怎么样。分开了。或者解耦了,好,这里是我们普通房子,那下面呢,当然还有一个高楼,我们也写一个high built。Hi。还有什么呢,Building。BUI。L building。好的,那这里面呢,我们同样的道理,对不对,也让他去继承我们这个builder。Hospital。House builder house builder,同样,这里面呢,也需要有三个方法。是不是好,我们写一下。那在这边呢,我们写上就是我们就是高楼,高楼呢,比如说他要建高的话,我们打地基,高楼的地基,高楼的地基。
12:04
地基。打地基多少米呢,比如说我们是这个一百一百米啊,因为要建高楼嘛,下面呢,一样的道理。高楼呢,我们高楼的这个房墙哈墙砌墙。气象多少呢?比如说我们是20厘米啊,比那个要厚一些。那紧接着呢,盖屋顶,那高楼的屋顶呢,我们盖的是。高楼高楼的这个高楼的这个透明的透明的屋顶,比如说啊,透明透。透明无敌。好的。那这个流程我们也写好了,也就是说到现在呢,我们把。呃,一个两个三个四个小,最后我们要需要一个指挥者,指挥者里面呢,会聚合我们这个house build,好,同学们,现在呢,我们来看一下house director怎么去完成写一段代码。
13:00
看看我的思路,同学们好,现在呢,我们写上这个house。什么呀,第一。Director。对不对,House director,好的,那现在呢,首先我们需要一个属性,把这个house build拿过来。Hospital,拿过来。House。Build hospital。那初始化我们为一个空。对,因为是聚合嘛,那怎么样让这个hospital传进来呢?我们有两种方式,第一种呢是通过构造器传入。对不对,传入这个hospital。第二种呢,我们是通过通过这个C方法。方法传入。对不对,两种都行,两种都行,那么我们先来写一个,呃,构造器,先来写个构造器。好,这个构造器呢,咱们就写到这就可以了,是吧,就是你传进来的时候呢,我们把这个放进去,这个super我就去掉,让它默认写到就行,那这是构造器的一种传入我们的一个build,那也可以通过set方法来写。
14:07
那我们把set方法呢,也给他传进去,好吧,Set方法是R,那在这里面给他一个set。这个方法呢,也是可以放进去的,比如说我们建造了一个房子过后,我们要换另外一个建造者,那么就通过赛来改变它就行了。好,这写完写完过后,好具体的建造流程在这里去指挥,因为我们刚才讲过,就是你这个指挥者呢,将来也可能有多个对吧,有多个,所以说我们盖房子的流程呢,由他来决定,就是如何。如何处理建房的?建造房子的一个流程交给谁呢?交给我们这个指挥者。交给指挥。指挥者。呃,指挥者,也就是说大家看到我在前面写这个,写这个common house的时候,在build里面,我并没有把这三个流程固定死。
15:06
对吧,我们说诶先盖打地基,再盖房,再再再封顶,没有,而因为这个具体怎么做呢,我们最好是交给这个指挥者去处理,指挥者他说诶先先打地基,咱们就先打地基,所以说诶我们在打地基之前,我们还有个电基,电基的一个仪式,那么就按你的指挥者来做,所以说在这呢,接着房子的流程交给指挥者,好由他来做这个事情,好吧,那就是public。好。怎么样了,咱们来。啊。TRY。Truck,是吧,House盖建造一个房子,在这里面,这个流程由你来决定,由你来决定,那么我们叫叫这个builder,他不是有很多方法吗?我们比如说先打地基。啊,先打地基,然后呢,盖盖墙,砌墙,对,然后呃呃再封顶,再封顶。
16:05
Ing roof,最后这个做完了以后怎么办呢?好,Return我们这个建好的这个产品,呃,建好的方式是不是在这里面有一个处理方法,就是build house。大家还记不记得builder里面有一个方法叫build house build house,他经过这三个流程以后呢,房子盖好了,把这个房子产品返回,返回就可以了。啊,什么一论,所以说我们这写的是这个是指挥者。指挥者,这里这里他会干什么呢?呃,去,指定去去。动态的去指定这个制作流程。制作流程,诶制作。对吧,制作流程。那尺寸资流成功呢,就返回我们这个产品具体的一个产品了。呃,比如说你这建造的时候,你是建的普通房子,那返回就是普通房子,你是建的高楼,返回就高楼,因为我这个号是,呃,因为大家从前面可以看得到。
17:07
我这返回的就是一个耗时对吧。不管你是什么样的耗时,你是什么就是什么。因为你这个流程来决定的。啊,因为你不同的建造流程,你盖的房子就不一样了。就是你不同的制作流程,你产产品也不一样,所以说在这指定的,那最后我们还有一个什么东西啊,还有一个来调用它一下来最后一个方法啊,最后一个类,这个类叫client。了解了同学们。好,这里呢,我们写一个主方法来使用它一下main方法,在这个main方法里边呢,我们怎么来玩呢?好比如说现在我们要去盖。盖什么房子呢?盖普通的这种盖。盖普通房。OK,盖普通房子的话呢,我们就这样写六一个common。Common house。媒体吧,同学们。这个普通房,普通房我们怎么去盖呢?好,首先我们还要创建,准备或者准备准备什么呢?准备创建房子的指挥者。
18:12
六一个防止指挥者出来directory。对,Builder不是就已经有了吗?这个就是一个具体的builder的类放给他。好,放给他过后,我们这个指挥者就拿到了,指挥者拿到以后。我现在已经通过构造器将我们这个。这个这个builder传进去了,因为common house,它就是一个具体的。这个建造者是吧,所以说建造者有了,指挥者也有了,就可以盖房,那盖房呢,我们。直接。访就行了啊,完成盖房。完成盖盖房子,返回,返回盖的房,返回产品。返回产品,这个产品就是你的房子。啊,就就是你的房子好,那这个房子呢,怎么怎么整呢,大家看house house。
19:02
点。这边它会返回一个我们的房子。好,这个房子就是根据你的这个建造流程返回的一个产品,对不对,你的产品是呃盖的什么墙,呃盖的什么墙,然后是修盖的什么屋顶,它都给你返回了,因为我们说产品本身它的区别是在于什么,在于你的要素,并不在于你的流程。比如说你是一个。你是一个小米手机还是一个苹果手机,反正都是手机,只是它的原料,它的功能不同而已,是不是,你比如说苹果手机,它用的这个原材料,这这这这个它的内核是五个G,你小米手机比如说内核是四个G,反正这都是有可能的啊,啊所以说这个呢,就是体现出这个不同,就体现出你的。这个成员变量不一样而已,好了同学们,那这个房子就盖好了,房子盖好了我们可以把这个流程输出来看一下。啊,输出。
20:00
输出这个流程。流程制作的这个流程,那呃,这个流程我们在这输一下就行哈,我们把这个产品。处理一下。好,我们看看这个地方这个流程。是不是在这已经写过了呀?我们看一下在普通房子里边建造过程中,我们这其实已经写过了,我们执行一下看看。这个流程是不是已经可以不用写了,走跑一个。好,可以看到,呃,这个流程已经有了,普通房子打地基起房子对吧,而且你其实还可以得到,比如说诶,我就想看我这个房子它的地基有多厚,我可以get。为什么呀?我们不是讲过吗?产品本身主要是取决于它的要素不一样,比如你是五米的墙还是十米的墙,就决定你的房子的质量不一样,是这样子吧?同学们好,这个我就不去写它了。好,当然,你既然可以做这个事情,是不是我还可以盖高楼啊盖高楼。盖高楼,那盖高楼的话呢,我们这边就留一个build。
21:05
Hi。High building。没问题吧,同学们,这个high building呢,我们要去让指挥者去做,指挥者已经有了,不需要再去创建,我们在这里重置。重置一个什么呢?建造者。对不对,那从事建造者就high,就是我们指挥的site,一个新的建造者就是那个我们的high building,也就现在呢,我们建造者变成了high building这个对象,而不是common,好使这个建造者了,那既既然如此,这做完了过后同样完成盖什么呢?盖房子。对不对,盖房子,那现在返回产品。返回产品,那返回这个产品显然是什么产品呢,也是一个房子,但是这个房子呢,就是个高楼了。哎,这是高楼,前面是一个普通房。没问题吧,同学们,那现在呢?我们怎么去盖呢?同样的道理了,House director。
22:02
第二点,我们的这个contract。好同学们,这个这个就拿到了啊,那我们再执行一下,为了好看。我们这儿打一个间隔。打一个间隔。好朋友们,我们运行时我们发现呢,诶你看。对吧。这是盖的普通房,这是高楼,那高楼你打的地基就是100米,墙就是20厘米。你普通房子就是五米,然后呢,这个墙是十米,普通房是这个普通房子,这个高楼是它建造好了过后,它的屋顶呢,是一个透明的房子,呃,透明的屋顶以此类推,所以说这就是我们一个经典的什么呀,建造者模式。建造的模式大家看能否理解,其实你仔细体会还是很有意思的,同学们可以看到,从这个类图我们可以看到产品在这里建造过程抽象出来。加油,然后呢,建造过程呢,具体你怎么建造,那就是你的过程,你按照你的方式来建造,你就产生的是一个common house。
23:06
你按照你的这个建高楼的方式来建,那你就是how high build build的这么一个产品。但是他们都是house。他们都是好事,明白啊啊,最后用指挥者来指挥,你用哪个来建造,建造的东西就不一样,好的同学们,那关于我们这一个建造者。建造者模式来解决盖房的代码呢?还有分析,我们就给大家讲到这里。
我来说两句