Builder模式

建造者模式定义

建造者模式是一种创建型模式,它可以让一个产品的内部表象和和产品的生产过程分离开,从而可以生成具有不同内部表象的产品

建造者模式中的主要角色

  • 抽象建造者(Builder)角色:定义抽象接口,规范产品各个部分的建造,必须包括建造方法和返回方法。
  • 具体建造者(Concrete)角色:实现抽象建造者接口。应用程序最终根据此角色中实现的业务逻辑创造产品。
  • 导演者(Director)角色:调用具体的建造者角色创造产品。
  • 产品(Product)角色:在导演者的指导下所创建的复杂对象。

适用性

  • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
  • 当构造过程必须允许被构造的对象有不同的表示时。

实例

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
<?php

/**
* Created by PhpStorm.
* User: Livfer
* Desc:
* Date: 2019/9/12
* Time: 18:09
*/

/**
* 地图产品-产品角色
* Class Product
*/
class Product
{
private $mapType;

public function __construct()
{
$this->mapType = [];
}

public function createMap($mapType)
{
return array_push($this->mapType, $mapType);
}

public function productResult()
{
return $this->mapType;
}
}

/**
* 建造者抽象类-建造者角色
* Class Builder
*/
abstract class Builder
{
public abstract function createMap();

public abstract function getResult();
}

/**
* 具体建造者类
* Class HighMapBuilder
*/
class HighMapBuilder extends Builder
{
private $product;

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

public function createMap()
{
$this->product->createMap("高清地图");
}

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

/**
* 具体建造者类
* Class SlowMapBuilder
*/
class SlowMapBuilder extends Builder
{
private $product;

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

public function createMap()
{
$this->product->createMap('低画质地图');
}

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

/**
* 具体执行的类-导演者角色
* Class Director
*/
class Director
{
protected $builder;

public function __construct(Builder $builder)
{
$builder->createMap();
}
}

//高清地图创建
$highBuilder = new HighMapBuilder();
$highMap = new Director($highBuilder);
$highMapResult = $highBuilder->getResult();

//低画质地图创建
$slowBuilder = new SlowMapBuilder();
$slowMap = new Director($slowBuilder);
$slowMapResult = $slowBuilder->getResult();

//$result = $slowMapResult->productResult();
//var_dump($result);