1
+ <?php
2
+
3
+ /**
4
+ * Design pattern "Builder" (Creational)
5
+ * This is demo code
6
+ * See for details: http://maxsite.org/page/php-patterns
7
+ */
8
+
9
+ /**
10
+ * Sample Product
11
+ */
12
+ class Product
13
+ {
14
+ private $ list ;
15
+
16
+ public function add ($ elem )
17
+ {
18
+ $ this ->list [] = $ elem ;
19
+ }
20
+
21
+ public function getProduct ()
22
+ {
23
+ foreach ($ this ->list as $ el ) {
24
+ echo $ el . '<br> ' ;
25
+ }
26
+ }
27
+ }
28
+
29
+ /**
30
+ * Director use builder
31
+ */
32
+ class Director
33
+ {
34
+ public function setConstruct ($ builder )
35
+ {
36
+ $ builder ->buildPartA ();
37
+ $ builder ->buildPartB ();
38
+ }
39
+ }
40
+
41
+ /**
42
+ * base for Builder
43
+ */
44
+ abstract class BuilderAbstract
45
+ {
46
+ public function buildPartA ()
47
+ {
48
+ }
49
+
50
+ public function buildPartB ()
51
+ {
52
+ }
53
+
54
+ abstract public function getResult ();
55
+ }
56
+
57
+ /**
58
+ * Builder1 knows how to make a product
59
+ */
60
+ class ConcreteBuilder1 extends BuilderAbstract
61
+ {
62
+ private $ product ;
63
+
64
+ public function __construct ()
65
+ {
66
+ $ this ->product = new Product ();
67
+ }
68
+
69
+ public function buildPartA ()
70
+ {
71
+ $ this ->product ->add ('Builder First Part A ' );
72
+ }
73
+
74
+ public function buildPartB ()
75
+ {
76
+ $ this ->product ->add ('Builder First Part B ' );
77
+ }
78
+
79
+ public function getResult ()
80
+ {
81
+ return $ this ->product ;
82
+ }
83
+ }
84
+
85
+ /**
86
+ * Builder2 knows how to make a product
87
+ */
88
+ class ConcreteBuilder2 extends BuilderAbstract
89
+ {
90
+ private $ product ;
91
+
92
+ public function __construct ()
93
+ {
94
+ $ this ->product = new Product ();
95
+ }
96
+
97
+ public function buildPartA ()
98
+ {
99
+ $ this ->product ->add ('Builder Second Part A ' );
100
+ }
101
+
102
+ public function buildPartB ()
103
+ {
104
+ $ this ->product ->add ('Builder Second Part B ' );
105
+ }
106
+
107
+ public function getResult ()
108
+ {
109
+ return $ this ->product ;
110
+ }
111
+ }
112
+
113
+
114
+ /**
115
+ * demo
116
+ */
117
+
118
+ /**
119
+ * set director
120
+ */
121
+ $ director = new Director ();
122
+
123
+ /**
124
+ * set builders
125
+ */
126
+ $ builder1 = new ConcreteBuilder1 ();
127
+ $ builder2 = new ConcreteBuilder2 ();
128
+
129
+ /**
130
+ * set Construct
131
+ */
132
+ $ director ->setConstruct ($ builder1 );
133
+
134
+ /**
135
+ * get product
136
+ */
137
+ $ product1 = $ builder1 ->getResult ();
138
+ $ product1 ->getProduct ();
139
+ /*
140
+ Builder First Part A
141
+ Builder First Part B
142
+ */
143
+
144
+ /**
145
+ * use builder2 for other product2
146
+ */
147
+ $ director ->setConstruct ($ builder2 );
148
+ $ product2 = $ builder2 ->getResult ();
149
+ $ product2 ->getProduct ();
150
+ /*
151
+ Builder Second Part A
152
+ Builder Second Part B
153
+ */
154
+
155
+
156
+ # end of file
0 commit comments