PHP设计模式之建造者模式

建造者模式定义了处理其他对象的复杂构建的对象设计。它的目的是消除对象的复杂创建过程。使用建造者模式在对象的构造进行扩展和修改时,尽可能的减少重复代码的修改。

以创建产品对象为例

创建产品对象第一版:常规方法

demo1.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php
header('Content-Type:text/html; charset=utf-8');

class Product{
private $type;
private $size;
private $color;

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

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

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

public function getProductInfo(){
return $this->type.$this->size.$this->color;
}
}

$color = '红色';
$type = '大号';
$size = '10CM';

$product1 = new Product();
$product1->setType($type);
$product1->setSize($size);
$product1->setColor($color);
echo $product1->getProductInfo();

echo '<br />';

$color = '蓝色';
$type = '小号';
$size = '5CM';

$product2 = new Product();
$product2->setType($type);
$product2->setSize($size);
$product2->setColor($color);
echo $product2->getProductInfo();

此版本就是一个创建产品对象的问题,本身不存在任何问题。问题在于,如果创建了大量的产品对象是,就会发现产品了大量的代码冗余,修改和维护带来了麻烦。

创建产品对象第二版:使用建造者模式来包装构建过程

demo2.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?php
header('Content-Type:text/html; charset=utf-8');

class Product{
private $type;
private $size;
private $color;

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

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

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

public function getProductInfo(){
return $this->type.$this->size.$this->color;
}
}

class ProductBuilder{
private $product;

public function __construct(){
$this->product = new Product();
}

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

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

$productArr = [
'color' => '红色',
'type' => '大号',
'size' => '10CM',
];

$product_builder1 = new ProductBuilder();
$product_builder1->build($productArr);
echo $product_builder1->getProduct()->getProductInfo();

echo '<br />';


$productArr = [
'color' => '蓝色',
'type' => '小号',
'size' => '5CM',
];

$product_builder2 = new ProductBuilder();
$product_builder2->build($productArr);
echo $product_builder2->getProduct()->getProductInfo();

此版本使用了建造者模式,把 Product 对象的复杂构建过程,通过 ProductBuilder类来包装,在之后的修改维护上带来了遍历,扩展上也方便许多。