建造者模式(Builder)将复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
建造者模式通常包括下面几个角色:
1. 生成器builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。
为创建一个Product对象的各个部件指定抽象接口;
2. ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例。
定义并明确它所创建的表示;
提供一个检索Product的接口;
3. 导向器Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。
构造一个使用Builder接口的对象;
4. Product:表示要创建的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程;
包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
在建造者模式中,Director规定了创建一个对象所需要的步骤和次序,Builder则提供了一些列完成这些步骤的方法,ConcreteBuilder给出了这些方法的具体实现,是对象的直接创建者。
建造者模式的结构图
协作
• 客户创建Director对象,并用它所想要的Builder对象进行配置。
• 一旦产品部件被生成,导向器就会通知生成器。
• 生成器处理导向器的请求,并将部件添加到该产品中。
• 客户从生成器中检索产品。
使用建造者模式的好处:
1.使用建造者模式可以使客户端不必知道产品内部组成的细节。它使你可以改变一个产品的内部表示;
Builder对象提供给导向器一个构造产品的抽象接口。该接口使得生成器可以隐藏这个产品的表示和内部结构。它同时也隐藏了该产品是如何装配的。因为产品是通过抽象接口构造的,你在改变该产品的内部表示时所要做的只是定义一个新的生成器。
2.具体的建造者类之间是相互独立的,对系统的扩展非常有利。它将构造代码和表示代码分开;
Builder模式通过封装一个复杂对象的创建和表示方式提高了对象的模块性。客户不需要知道定义产品内部结构的类的所有信息;这些类是不出现在Builder接口中的。每个ConcreteBuilder包含了创建和装配一个特定产品的所有代码。这些代码只需要写一次;然后不同的Director可以复用它以在相同部件集合的基础上构作不同的Product。
3.由于具体的建造者是独立的,因此可以对建造过程进行更精细的控制,而不对其他的模块产生任何影响。
Builder模式与一下子就生成产品的创建型模式不同,它是在导向者的控制下一步一步构造产品的。仅当该产品完成时导向者才从生成器中取回它。因此Builder接口相比其他创建型模式能更好的反映产品的构造过程。这使你可以更精细的控制构建过程,从而能更精细的控制所得产品的内部结构。
使用建造模式的场合:
1.创建一些复杂的对象时,这些对象的内部组成构件间的建造顺序是稳定的,但是对象的内部组成构件面临着复杂的变化。
2.要创建的复杂对象的算法,独立于该对象的组成部分,也独立于组成部分的装配方法时。
3. 当构造过程必须允许被构造的对象有不同的表示时。
相关模式
Abstract Factory(3 . 1)与Builder相似,因为它也可以创建复杂对象。主要的区别是Builder模式着重于一步步构造一个复杂对象。而 Abstract Factory着重于多个系列的产品对象(简单的或是复杂的) 。Builder在最后的一步返回产品,而对于 Abstract Factory来说,产品是立即返回的。
Composite(4.3)通常是用Builder生成的。