生成器模式
维基百科,自由的百科全书
又名:建造(Builder)模式
目录 |
[编辑] 意图
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
[编辑] 适用性
在以下情况使用Build模式
- 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时;
- 当构造过程必须允许被构造的对象有不同的表示时。
[编辑] 参与者
- Builder
- 为创建一个Product对象的各个部件指定抽象接口。
- ConcreateBuilder
- 实现Builder的接口以构造和装配该产品的各个部件。
- 定义并明确它所创建的表示。
- 提供一个检索产品的接口
- Director
- 构造一个使用Builder接口的对象。
- Product
- 表示被构造的复杂对象。ConcreateBuilder创建该产品的内部表示并定义它的装配过程。
- 包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
==协作==
Image:Build construct.png
客户创建Director对象,并用它所想要的Builder对象进行配置。
- 一旦产品部件被生成,导向器就会通知生成器。
- 生成器处理导向器的请求,并将部件添加到该产品中。
- 客户从生成器中检索产品。
[编辑] PHP代码
<?php //设计模式:Builder模式模式 //Coder: rollenc ( http://www.rollenc.com ) interface Builder { function buildPartA(); //创建部件A比如创建汽车车轮 //创建部件B 比如创建汽车方向盘 function buildPartB(); //创建部件C 比如创建汽车发动机 function buildPartC(); //返回最后组装成品结果 (返回最后装配好的汽车) //成品的组装过程不在这里进行,而是转移到下面的Director类中进行. //从而实现了解耦过程和部件 //return Product function getResult(); } class Director { private $builder; public function __construct($builder ) { $this->builder = $builder; } // 将部件partA partB partC最后组成复杂对象 //这里是将车轮 方向盘和发动机组装成汽车的过程 public function construct() { $this->builder->buildPartA(); $this->builder->buildPartB(); $this->builder->buildPartC(); } } class ConcreteBuilder implements Builder { public $partA, $partB, $partC; public function buildPartA() { echo 'partA is builded' . "\n"; } public function buildPartB() { echo 'partB is builded' . "\n"; } public function buildPartC() { echo 'partC is builded' . "\n"; } public function getResult () { echo 'Return product.' . "\n"; return 1; } } $builder = new ConcreteBuilder(); $director = new Director( $builder ); $director->construct(); $product = $builder->getResult(); ?>
[编辑] 注意问题
- 装配和构造接口
- 生成器逐步的构造它们的产品。因此Builder类接口必须足够普遍,以便为各种类型的具体生成器构造产品。
- 没有抽象类
- 通常情况下,由具体生成器生成的产品,它们的表示相差是如此之大以至于给不同的产品以公共父类没有太大意思。
- 在Builder中却省的方法为空
- 定义为空方法可以使客户只重定义他们所感兴趣的操作。
[编辑] 不解
整个Builder构建完成后,如果我需要增加一个D部分,那么我就需要修改N处,以增加D的实现。这似乎太麻烦了点。有没有好的解决方法?
[编辑] 效果
- 它使你可以改变一个产品的内部表示
- 它将构造代码和表示代码分开
- 它使你可对构造过程进行更精细的控制
[编辑] 相关模式
抽象工厂模式与Builder相似,因为它也可以创建复杂对象。主要的区别是Builder模式着重于一步步构造一个复杂对象。而抽象工厂模式着重于多个系列的产品对象(简单的或是复杂的)。Builder在最后的一步返回产品,而对于Abstract Factory来说,产品是立即返回的。
Composite通常是用Builder生成的。
[编辑] 参考
设计模式:可复用面向对象软件的基础