1、意图
将一个复杂对象的构建与它的表示分离开,使得同样的构建过程可以创建不同的表示。
2、问题
- 创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式。
- 构造过程必须允许被构造的对象有不同的表示。
3、解决方案
将复杂对象的构造方法独立出来。
4、通用结构
5、参与者
- builder:为创建一个Product的各个部件指定抽象接口。
- ConcreteBuilder:实现Builder的各个接口以构造和装配该产品的的各个部件;定义并明确它所创建的表示;提供一个查询产品的接口。
- Director:构造一个使用Builder接口的对象。
- Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程;包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
6、协作
- 客户创建Director对象并使用它所想要的Builder对象进行配置;
- 一旦产品部件被生成,Director(导向器)将会通知Builder(生成器);
- Builder处理Director的请求,并将该部件添加到该产品中;
- 客户从Builder中得到产品结果。
7、效果
- 很容易改变一个产品的内部表示: 因为产品是通过抽象接口构造的,在改变一个产品的内部表示时只需要创建一个新的生成器。
- 将构造代码和表示代码分开:客户不需要知道定义产品内部结构的类的所有信息。
- 对构造过程进行更精细的控制
8、实现
- Builder类的接口需要足够普遍,以便为各种类型的具体生成器构造产品。
- C++中,声明Builder类的抽象接口不声明为纯虚函数,而是把他们定义为空方法,这是客户只需重定义他们感兴趣的操作。
9、实例