目录
一、什么是建造者模式
Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种。
Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。
将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示。
二、建造者模式的结构
三、建造者模式的角色和职责
Builder
生成器接口,定义创建一个Product对象所需要的各个部件的操作
ConcreteBuilder
具体的生成器实现,实现各个部件的创建,并负责组装Product对象的各个部件,同时还提供一个让用户获取组装完成后的产品对象的方法
Director
指导者,主要用来使用Builder接口,以一个统一的过程来构建所需要的Product对象
Product
产品,表示被生成器构建的对象,包含多个部件
四、建造者模式应用场景
- 对象的创建:Builder模式是为对象的创建而设计的模式
- 创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象
- 关注对象创建的各部分的创建过程:不同的工厂(这里指builder生成器)对产品属性有不同的创建方法
五、代码示例
六、理解生成器模式
生成器模式功能
主要功能是构建复杂的产品,而且是细化的,分步骤的构建产品,也就是生成器模式重在解决一步一步构造复杂对象的问题。
更重要的是,这个构建过程是统一的,固定不变的,变化的部分放到生成器部分了,只要配置不同的生成器,那么同样的构建过程,就能构造出不同的产品表示来。
生成器模式的重心在于分离构建算法和具体的构造实现,从而使得构建算法可以重用,具体的构造实现可以很方便的扩展和切换,从而实现灵活的组合来构造出不同的产品对象。
生成器模式的构成
生成器模式分成很重要的两个部分:
1.Builder接口部分
定义了如何构建各个部件,也就是知道每个部件功能如何实现,以及如何装配这些部件到产品中去。
2.Director部分
知道如何组合来构建产品,也就是说负责整体的构建算法,而且通常是分步骤来执行
不管如何变化,Builder模式都存在这么两个部分,一个部分是部件构造和产品装配,另一个部分是整体构建的算法。在生成器模式中,强调的是固定整体的构建算法,而灵活扩展和切换部件的具体构造和产品装配的方式。
在Director实现整体构建算法的时候,遇到需要创建和组合具体部件的时候,就会把这些功能委托给Builder去完成。
生成器模式的使用
应用生成器模式的时候,可以让客户端创造Director,在Director里面封装整体构建算法,然后让Director去调用Builder,让Builder来封装具体部件的构建功能。
还有一种就是让客户端和Director融合起来,客户端直接操作Builder。
生成器模式的实现
1.生成器的实现
实际上在Builder接口的实现中,每个部件构建的方法里面,除了部件装配外,也可以实现如何具体的创建各个部件对象,也就是说每个方法都可以有两部分功能,一个是创建部件对象,一个是组装部件。
在构建部件的方法里可以实现选择并创建具体的部件对象,然后再把这个部件对象组装到产品对象中去,这样Builder就可以和工厂结合使用
如果在实现Builder的时候,只有创建对象的功能,而没有组装的功能,那么这个时候的Builder实现就和抽象工厂类似。这种情况下,Builder接口就类似于抽象工厂的接口,Builder具体实现就类似于具体的工厂,而且Builder接口里面定义的创建各个部件的方法也是有关联的,他们是构建一个复杂对象所需要的部件对象。
2.指导者的实现
在生成器模式里面,指导者承担的是整体构建算法部分,是相对不变的部分。因此在实现指导者的时候,把变化的部分分离出去是很重要的。
指导者分离出去的变化的部分,就到了生成器这边,指导者知道整体的构建算法,就是不知道如何具体的创建和装配部件对象。
3.指导者和生成器的交互
在生成器模式里,指导者和生成器的交互,是通过生成器的那些buildPart方法来完成的。指导者通常会实现比较复杂的算法和运算过程,实际中可能有这样的情况:
a.在运行指导者的时候,会按照整体构建算法的步骤进行运算,可能先运行前几步运算,到了某一步骤,需要具体创建某个部件对象了,然后就调用Builder中创建相应部件的方法来创建具体的部件。同时,把前面运算得到的数据传递给Builder,因为在Builder内部实现创建和组装部件的时候,可能会需要这些数据
b.Builder创建完具体的部件对象之后,会把创建好的部件对象返回给指导者,指导者继续后续的算法运算,可能会用到已经创建好的对象
c.如此反复,直到整个构建算法已经完成,那么最终的产品对象也就创建好了。
由此看出,指导者和生成器是需要相互交互的,方式就是通过生成器方法的参数和返回值,来回的传递数据。事实上,指导者是通过委托的方式来把功能交给生成器去完成
4.返回装配好的产品的方法
在标准的生成器模式里,在Builder实现里面会提供一个返回装配好的产品的方法,在Builder接口上是没有的。他考虑的是最终的对象一定要通过部件构建和装配,才算真正构建了,而具体干活的就是这个Builder实现,虽然指导者也参与了,但是指导者是不负责具体的部件创建和组装的,因此客户端是从Builder实现里面获取最终装配好的产品。
5.关于被构建的产品的接口
在使用生成器模式的时候,大多数情况下是不知道最终构建出来的产品是什么样的,所以在标准的生成器模式里,一般是不需要对产品定义抽象接口的,因为最终构造的产品千差万别,给这些产品定义一个公共接口是没有意义的。
生成器模式优缺点
1.产品构建与表现松散耦合
2.容易改变产品的内部表示(新建Builder)
3.更好的复用性
思考生成器模式
本质
分离整体的构建算法和部件构造
何时选用
1.创建对象的算法,应该独立于该对象的组成部分以及他们的装配方式
2.同一个构建过程有着不同的表示