首先提出几个问题:
- 什么是Builder模式?
- 为什么要使用Builder模式?它的优点是什么,那缺点呢?
- 什么情况下使用Builder模式?
关于Builder模式在代码中用的很多,比如AlertDialog, OkHttpClient等。一提到模式感觉像是一个很牛的招式。用起来很炫。
那先看看Builder是由什么组成,他的基本思想是什么
从类图中可以看出Builder 有四个角色
- 抽象建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。该接口定义两种方法,一种方法是建造方法,一般来说, 产品所包含的零件数目与建造方法的数目相符。
- 具体创建者(Concrete Builder)角色: 担任这个角色的是与应用程序紧密相关的一些类,它们在应用程序调用下创建产品的实例。这个角色要完成的任务包括:1.实现抽象建造者Builder所生命的接口,给出一步一步地完成产品实例的操作。2.在建造过程完成后,提供产品的实例。
- 导演者(Director)角色, 担任这个角色的类调用具体建造者角色以创建产品对象。
- 产品(Product)角色:产品(Product)便是建造中的复杂对象。
回到前面的问题,为什么要使用建造模式呢
- 一个对象会有一些重要的性质,在它们没有恰当的值之前,对象不能作为一个完成的产品使用。
一个对象的一些性质必须按照某个顺序赋值才有意义。
这个时候,此对象相当于一个有待建造的产品,而对象的
些性质相当于产品的零件,建造茶品的过程是建造零件的过
程。由于建造零件的过程很复杂,因此,这些零件的建造过
程往往被“外部化”到另一个称为建造者的对象里,建造者对
象返还给客户端的是一个全部零件都建造完毕的产品对象。
那么在什么情况下才应该使用建造模式需要生成的产品对象有复杂的内部结构,每一个成分本身也可以是对象,也可以仅仅是对象的的一个组成成分。
- 需要生成的产品对象的属性相互依赖。建造模式可以强制实行一种分步骤进行的建造过程。因此,如果产品对象的一个属性必须在另一个属性被赋值之后才可以被赋值,使用建造模式便是一个很好的设计思想。
- 在对象创建过程中会使用到系统中的其他一些对象,这些对象在产品对象的创建过程中不易得到。
下面来看一下建造模式的优点
- 建造模式的使用使得产品可以独立地变化。使用建造模式可以使客户端不必知道产品的内部组成的细节。
- 每一个Builder都相对独立,而其他的Build无关。
- 模式所建造的最终产品更容易于控制。