在本讲,我们来学习一下创建型模式里面的最后一个设计模式,即建造者模式。
概述
建造者模式是指将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。
读完这句话之后,我估计很多人都已经懵了,这说的是什么意思啊?哈哈哈😊,别急,下面我会给大家解释一下,先看一下下面这张图。
上图右边是一个主机,而左边则是主机里面包含的部件(或者组件),有主板、cpu、内存条、风扇、硬盘以及电源。
结合这张图,我来向大家解释一下建造者模式的概念。建造者模式的概念中不是有一个复杂对象吗?你可以将其理解为上图中的主机。为什么把它称为复杂对象呢?因为主机里面是包含了很多很多部件的。其实,建造者模式说的就是将主机和主机里面的部件进行了一个分离,分离之后有什么好处呢?解除耦合呗!另外,你可以把上图中的那些组件装配成一个主机的过程理解为建造者模式概念中的构建过程。
而同样的构建过程,也即不同的装配方式,最终创建出来的复杂对象(即主机)是不同的。这个如何去理解呢?例如,我现在主板、cpu、内存条都换了一个品牌,那么这时同样的一个装配过程最终出来的主机肯定和之前的是不一样的,你想啊,我现在的内存条选择的是16G,之前有可能选择的是8G,那现在装配的主机肯定和之前的是不一样的啊!
经过我上面的解释,相信大家一定理解了建造者模式。下面,我们再来看一下有关建造者模式的具体的描述。
-
建造者模式分离了部件的构造(由Builder来负责构造,Builder是建造者模式中的一个角色)和装配(由Director负责装配,Director也是建造者模式中的一个角色),从而就可以构造出复杂的对象了,而且我们使用建造者模式最终要的就是这个复杂对象。这个模式适用于某个对象的构建过程复杂的情况,若是这种情况,则可以使用建造者模式 -
由于实现了构建和装配的解耦,不同的构建器,相同的装配,也可以做出不同的对象,就拿我上面举的例子来说,如果构成主机组件的品牌发生了变化,那么以同样的方式进行组装,出来的肯定是不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法、装配算法的解耦,这样就实现了更好的复用 -
建造者模式可以将部件和其组装过程分开,一步一步创建一个复杂的对象。用户只需要指定复杂对象的类型就可以得到该对象,而无须知道其内部的具体构造细节。 这就跟我们去买一台电脑一样,我们不关注这台电脑里面用的每个品牌的组件以及它是如何进行装配的,我们只关注最终买的是一台电脑就行了
相信读到这,大家对建造者模式又有了一个深刻的认识。
结构
建造者(Builder)模式包含有如下角色:
-
抽象建造者类(Builder):这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的部件对象的创建,而是由具体建造者类来实现。 注意了,这里说的接口并不是我们通常在Java里面定义的接口,而是指的是一种规范,既可以是Java里面的接口,又可以是抽象类,希望大家能明白这点~ -
具体建造者类(ConcreteBuilder):实现Builder接口,完成复杂产品的各个部件的具体创建方法。在构造过程完成后,提供产品的实例。 注意了,建造者模式的核心思想并不在于复杂对象各个部件的创建,而是强调的是整个装配的过程,至于对于这些部件的创建,我们既可以使用工厂方法模式,又可以使用抽象工厂模式 -
产品类(Product):要创建的复杂对象 -
指挥者类(Director):调用具体建造者来创建复杂对象的各个部分,在指挥者中不涉及具体产品的信息,它只负责保证对象各个部分完整创建或按某种顺序创建。 也就是说,指挥者所要完成的工作就是装配复杂对象。举个例子,小妹需要一台电脑来学Java,她想要我帮她组装一台电脑,在组装电脑的过程中,我是不管cpu是什么牌子的,至于这个cpu是怎么去构建的,究竟是小妹自己买的还是自己造的,我也通通不管,我就只负责装配,很显然这里指挥者类就是指我本人
了解了建造者模式里面包含的角色之后,接下来我们便来看一下下面的类图,根据以下类图我会再为大家讲解一下建造者模式。
从以上类图中可以看到,在抽象建造者类里面构建了各个部分,比如buildPartA方法来构建A部分,buildPartB方法来构建B部分,而且这些方法都是抽象的,需要由具体的建造者去实现,也即构建具体的部件;再来看一下指挥者类,注意看,它是将Builder聚合进来了,而且在construct这个组装方法里面,还会将各个部件组装成一个复杂对象哟;最后看一下具体建造者类,它除了要重写抽象建造者类里面的抽象方法之外,还提供了一个获取复杂对象的方法,即getResult,调用该方法我们就可以获取到复杂对象。
以上类图分析完了之后,接下来我们就通过一个案例再去深入地理解一下建造者模式,而这个案例就是创建共享单车,也就是生产自行车。
案例
。。。
|