简介
建造者模式也叫做生成器模式。在构建一个复杂的物品时,例如:电脑,它就是一个复杂的物品,它主要是由CPU、主板、硬盘、显卡、机箱等组装而成的。但是对于这样的产品,组装流水线是固定的,不变的,但是把不同的主板和其他组件组装在一起就会生产出不同型号的电脑。
在软件系统中我们也会遇到类似的复杂对象,并且这个复杂对象的各个部分按照一定的算法组合在一起,此时该对象的创建工作就可以使用Builder模式
。
动机
在软件系统中,有时候面临着一个复杂对象的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
使用场景
一些基本部件不会变,而其组合经常变化的时候,在构建这个复杂产品(对象)的时候,就可以考虑使用建造者模式。
意图
将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示(产品)。
结构图
模式的组成
- 抽象建造者角色(
Builder
):为创建一个Product对象的各个部件指定抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此角色规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。 具体建造者(
ConcreteBuilder
)- 实现
Builder
的接口以构造和装配该产品的各个部件。即实现抽象建造者角色Builder
的方法。 - 定义并明确它所创建的表示,即针对不同的商业逻辑,具体化复杂对象的各部分的创建
- 提供一个检索产品的接口
- 构造一个使用Builder接口的对象即在指导者的调用下创建产品实例
- 实现
指导者(
Director
):调用具体建造者角色以创建产品对象的各个部分。指导者并没有涉及具体产品类的信息,真正拥有具体产品的信息是具体建造者对象。它只负责保证对象各部分完整创建或按某种顺序创建。- 产品角色(
Product
):建造中的复杂对象。它要包含那些定义组件的类,包括将这些组件装配成产品的接口。
模式的代码实现
1 | using System; |
实现要点
在【建造者模式】中,指挥者
是直接与客户端打交道的,指挥者将客户端创建产品的请求划分为对各个部件的建造请求,再将这些请求委派到具体建造者角色,具体建造者角色是完成具体产品的构建工作的,却不为客户所知道。 建造者模式主要用于分步骤来构建一个复杂的对象,其中:
- 分步骤是一个固定的组合过程,通过
指挥者
来组装实现。 - 复杂对象的各个部分是经常变化的,产品不需要抽象类,由于建造模式的创建出来的最终产品可能差异很大,所以不大可能提炼出一个抽象产品类。
优缺点
优点
- 使用建造者模式可以使客户端不必知道产品内部组成的细节。
- 具体的建造者类之间是相互独立的,容易扩展。
- 由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。
缺点
- 产生多余的
Build
对象以及Dirextor
类。
创建者模式的使用场景
- 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
- 相同的方法,不同的执行顺序,产生不同的事件结果时。
- 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时。
- 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能。
- 创建一些复杂的对象时,这些对象的内部组成构件间的建造顺序是稳定的,但是对象的内部组成构件面临着复杂的变化。