00:00
Java设计模式的建造者模式,也叫builder。模式,那我们来看一下这个建造者模式,它是一个怎么样的一个概念,来聊一聊,还是用一个项目的需求来引出我们的建造者模式,那同学们先看一下我这里有一个盖房子的一个需求,那这个盖房子的需求呢,他是这么一个要求,说现在我要盖房。那大家都知道,盖房呢,它其实是有一个固定的流程的,假如他的第一个流程是打地基。对不对,Build basic,第二个呢是砌墙。就是把墙砌起来,第三一个呢,就是封顶,假如我们盖房子的流程就这么三个,OK。那大家也知道房子呢,它有各种各样的,咱们有普通的这种简易房。那也有高楼,就是那个二三十层的那种高楼,还有别墅,所以说虽然流程是一样,但是他具体的操作肯定不一样,比如说你去盖一个普通的房子,咱们地基可能就打五米,对不对,假如啊,咱们建高楼你盖,呃,打这个地基五米就不够了,可能打的是50米,是这样子的吧,所以说他们流程虽然一样,但是具体的操作方式呢,有区别。
01:20
OK,那现在呢,就要求我们编写一个程序来完成这个需求,同学们想一想你会怎么做?好,这样子我们呢,仍然用先用传统的方式来解决盖房的这么一个需求,首先呢,我们来画出。我这个传统方式解决盖房的类图,来,各位朋友打开我们的eclipse。那这里呢,我新建一个包包,对,因为现在我们讲的是建造者模式,所以说我写个叫build。没问题吧,Builder。那标准里面呢,我们首先把我们的这一个类图,就是传统解决方案的类图先画出来。
02:02
好的,那这个类图准备怎么去设计呢?首先根据前面的分析,我们认为盖房因为有各种各样的房,所以说我们先抽象一个,我们先抽象一个负类出来,这个没问题吧,那也就是说我先我先写个负类,下面呢,由普通的房子,高楼别墅怎么样来继承它,完成它的一系列的操作,不就完了吗?对不对?大家最容易想到的应该也是这个流程,好,首先第一个abstract,就是我们一个抽象的房子house。呃,那么这个房子里面,我们刚才已经分析,它有一些固定的流程,比如说第一个流程是打地基,打地基呢,我们就叫Bill。Build build什么呢?这是打地基的一个操作,那砌墙的操作呢,我们来写一个。好砌墙,比如说这个名字我们取个比较Bill的什么呢,我。
03:04
盖砌墙,那第三个操作就是我们的什么呀。盖屋顶。Roof roof RO。Roof这个就叫盖房顶,那这是个抽象类,那下面我们有具体的类来实现,比如说我有个普通房子叫他。House。没吧,那么我们还有什么房子呢?比如说我们有高楼,我就是叫嗨。Hi。B。Building building building building。好,那我让这两个子类干什么呀?去使去继承我们这个抽象的房子,然后在这里面呢,把他的build basic build wall roof实现就可以了,是这个意思吧?同学们好,那这个类图有了,我们是不是就可以来尝试着完成这个代码?来,我们先写第一种方式,我先写个包包。
04:04
我们现在第一种方式哈,传统方式我就直接写到这,改进的方案我写到里边去,OK,那既然如此,我们首先呢,先把这个抽象类obtract house建起来。没问题吧,同学们这是up house,那这个里面有哪些操作?同学们根据刚才我的这个分析,你们想一想应该怎么写啊。首先。它是一个抽象类,所以说我写个abstract。没问题,然后呢,我们先写这个打地基,打地基。打地基的这个方法叫public。那这个。我们写个abstract抽象方法吗?Obtra VO build标的什么呀?Basic。好的,这个方法第一个就写完,第二个呢,我们叫做砌墙。气枪。
05:01
砌砌墙。OK,那七强我们也照门画虎,Obstract VO,什么build?标的什么呢,我。What?好,这又是一个方法就写完了,紧接着我们还有一个什么呢啊,就是封顶。对吧,封顶public abstract,抽象的abstract。然后呢,Void。什么方法呀?Roof封顶吗?就是把这个房底给封起来,同学们想你这三个操作,你这三个操作其实是有顺序的,对不对,那所以说我们呢,把这三个方法给合在一个方法里面就可以了,叫public void build。然后呢,我在这里依次调用我们已经写好的这三个方法,只这三个方法呢,我们要子类去实现第一个。第二个,盖房顶。盖房顶啊,第二个是砌墙,第三个干什么呀,第三一个就是封顶。
06:06
好的,那同学们看到我们的一个抽象类就写完了,也就是说我们的这个OK了,那现在呢,我们建两个子类,Common house和high build building,那同学们我建一个就可以了,这个写一个,大家把这个意思理解就可以了,啊,我我盖一个普通的房子,大家看我怎么写,朋友们来走,新建一个类叫come。Horse。Common house,那这个类他要干什么呢?他要去继承同学们,他要继承谁呀?他要继承我们刚才写的abstract house。成为它的一个什么子类,子类,OK,这里面有三个方法将它实现。好,第一个方法,我们写一写,走。在干什么呢?打地基嘛,我们就写一句话,就说给普通房子,普通普通房子打地基。
07:04
好,写完第二个呢,这个地方是给普通房子砌墙,是不是我们以示区别就可以了。普通。普通房子干什么呀,砌墙?好写完,那下面这个盖屋顶也很好理解,就是给我们这个普通房子封顶,好写上啊,来,走一个一就。普通普通房子干什么,这个封顶。封顶,OK,代码写完,那代码写完过后,我们是不是还有一个类要去用它,也就是说我们还有一个client端去使用它来再写一个类。就是it client,那我们这个普通的这个客户端,这个理解成客户端,他要去,他要去用谁呢?各位朋友。他去用谁呢?诶,我们如果是盖一个普通房子,那我们就创建一个普通房子,然后调用他的这个build的方法就可以了,有时这里面是不是还有一个方法,刚才忘写了叫build方法。
08:07
A build方法是把这三个方法合在一起的,对不对?Build。OK,好,那也就是说我这个客户端要去依赖。或者叫做使用到各自的房子就行了,现在我只写了一个普通房子,那同学们来体验一下就可以,来吧,走,建一个客户端client。没问题吧,同学们把主方法勾上。把主方法勾上,那下面呢,各位朋友我溜一下,我列一个普通房。没问题吧,同学们,Common。然后呢,给他分配一个名称,普通房子里面不是他有相应的方法吗?点build就可以了。来各位同学运行之,那运行一般我们可以看到这个效果,对不对,我们可以看到这个效果,来同学们看,他说普通房子打地基,普通房子砌墙,普通房子封顶,那最后就房子就盖好了。
09:03
那同学们想一想这个代码。其实他已经把这个过程完成了,因为你创建了一个房子,然后把这个三个流程也走了,那房子也就建好了吗。但有什么问题吗?有什么问题吗?来,各位朋友,我们分析一下代码问题在哪里?这段代码呢,从逻辑上来说,它是比较好理解的,其实就是用的我们比较传统的这种继承的方式来解决的。对不对,但是这种设计结构过于的简单。过于简单,没有设计缓缓存成的对象,就中间呢,我们直接就盖了,那么程序的扩展性和维护性不是很好,这种方案它的缺点是在什么地方呢?他把这个产品。这个产品就是我们的房子嘛,你盖好了,或者就是普通房或者高楼,或者是别墅。他把这一个产品和我们创建的这个过程怎么样封装在一起了,大家有没有发现我们common。
10:02
我们common这个地方是有具体的一个建造的过程的。也就是说他把这个房子本身,这个房子的产房子就是我们产品,把这个产品和产品的创建过程,其实它是封装在一起的。从前面我们也可以看到,那既然你服装一起呢,这样耦合性就会变得很强。理论上来说我们一个产品。经过一个流水线的制作,最后得到了一个成品,而我们制作的流程和产品本身,按理说呢,应该是可以分开的,也就是说我们现在解决的方案就是要把产品和产品建造的这个过程进行解耦。经解耦,这就是我们要用到的建造者模式。待会儿呢,大家会体现到建造的模式还是非常有意思的啊,它就是它的核心思想,就是把产品和产品建造过程进行解耦。好的,那同学们,第一个我们通过这个盖房子的一个需求。
11:03
怎么样,我们用传统方式解决了,然后呢我们也解,我们也提出他的问题是在于产品和产品过程耦合心态想我们要解决,引出了我们建造者模式,那么建造建造者模式到底是什么样子的呢?我们下一节为大家进行讲解。
我来说两句