Паттерн Builder является паттерном создания объектов (creational pattern). Суть его заключается в том, чтобы отделитьпроцесс создания некоторого сложного объекта от его представления. Таким образом, можно получать различныепредставления объекта, используя один и тот же “технологический” процесс.
Цель
Отделяет конструирование сложного объекта от его представления, так что в результате одного и того же процессаконструирования могут получаться разные представления.
Плюсы
- позволяет изменять внутреннее представление продукта;
- изолирует код, реализующий конструирование и представление;
- дает более тонкий контроль над процессом конструирования.
Применение
- алгоритм создания сложного объекта не должен зависеть от того, из каких частей состоит объект и как онистыкуются между собой;
- процесс конструирования должен обеспечивать различные представления конструируемого объекта.
1: <?php
2:
3: class Phone
4: {
5: private $_name;
6: private $_os;
7:
8: public function setName($name)
9: {
10: $this->_name = $name;
11: }
12:
13: public function setOs($os)
14: {
15: $this->_os = $os;
16: }
17: }
18:
19: abstract class BuilderPhone
20: {
21: protected $_phone;
22:
23: public function getPhone()
24: {
25: return $this->_phone;
26: }
27:
28: public function createPhone()
29: {
30: $this->_phone = new Phone();
31: }
32:
33: abstract public function buildName();
34:
35: abstract public function buildOs();
36: }
37:
38: class BuilderNexus4 extends BuilderPhone
39: {
40: public function buildName()
41: {
42: $this->_phone->setName('Nexus4');
43: }
44:
45: public function buildOs()
46: {
47: $this->_phone->setOs("Android");
48: }
49: }
50:
51: class BuilderIphone5 extends BuilderPhone
52: {
53: public function buildName()
54: {
55: $this->_phone->setName('Iphone5');
56: }
57:
58: public function buildOs()
59: {
60: $this->_phone->setOs("iOs");
61: }
62: }
63:
64: class Chooser
65: {
66: private $_builderPhone;
67:
68: public function setBuilderPhone(BuilderPhone $mp)
69: {
70: $this->_builderPhone = $mp;
71: }
72:
73: public function getPhone()
74: {
75: return $this->_builderPhone->getPhone();
76: }
77:
78: public function constructPhone()
79: {
80: $this->_builderPhone->createPhone();
81: $this->_builderPhone->buildName();
82: $this->_builderPhone->buildOs();
83: }
84: }
85:
86: $user = new Chooser();
87: $google = new BuilderNexus4();
88: $apple = new BuilderIphone5();
89: $user->setBuilderPhone($google);
90: $user->constructPhone();
91: $realPhone = $user->getPhone();// :)