PHP设计模式-建造

适用性

  • 建造者设计模式定义了处理其他对象的复杂构建的对象设计

UML

代码示例

具体项目包含一个创建复杂产品对象的类,这个类包含完整构成对象的三个方法。如果在创建新产品对象时没有调用其中一个方法,那么类的属性便会失去。并且程序也会中断。这三个方法setType() setColor() serSize()。如下面的代码所示,最早版本的代码呗设计为先创建产品对象。然后再执行上述三个方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class product{
protected $_type = '' ;
protected $_size = '' ;
protected $_color = '' ;

public function setType($type)
{
$this->_type = $type;
}

public function setSize($size)
{
$this->_size = $size;
}

public function setColor($color)
{
$this->_color = $color;
}
}

为了创建完整的产品对象,需要将产品配置分别传递产品类的每个方法:

1
2
3
4
5
6
$productConfigs = array('type'=>'shirt','size'=>'XL','color'=>'red');

$product = new product();
$product->setType($productConfigs['type']);
$product->setSize($productConfigs['size']);
$product->setColor($productConfigs['color']);

创建对象时分别调用每个方法并不是最佳的做法。此时,我们最好使用基于建造者设计模式的对象来创建这个产品实例。

producBuilder 类被设计为接受构建 product 对象所需的这些配置选项。 它不仅存储配置参数,而且存储一个实例化的新 product 实例,build() 方法负责调用 product 类中的所有方法,从而构建完整的 product 对象。最后,getProduct() 方法返回完整构建的 product 对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class productBuilder
{
protected $_product = null;
protected $_configs = array();

public function __construct($configs)
{
$this->_product = new product();
$this->_configs = $configs;
}

public function build()
{
$this->_product->setSize($this->_configs['size']);
$this->_product->setType($this->_configs['type']);
$this->_product->setColor($this->_configs['color']);
}

public function getProduct()
{
return $this->_product;
}
}

需要注意的是,build() 方法隐藏了来自请求新 product 对象的代码的实际方法调用。如果 product 类以后发生改变,那么只需要修改 productBuilder 类的 build() 方法,下面的代码说明了如何使用 productBuilder 类创建 product 对象:

1
2
3
$builder = new productBuilder($productConfigs);
$builder->build();
$product = $builder->getProduct();

建造者设计模式的目的是消除其他对象的复杂创建的过程。使用建造者设计模式不仅是最近的做法。而且在某个对象的构造和配置方法改变时可以尽可能的减少重复更改代码。