建造者模式

建造者模式和抽象工厂模式很像,总体上,建造者模式仅仅只比抽象工厂模式多了一个“导演类”的角色。
与抽象工厂模式相比,建造者模式一般用来创建更为复杂的对象,因为对象的创建过程更为复杂,因此将对象的创建过程独立出来组成一个新的类 —— 导演类。
也就是说,抽像工厂模式是将对象的全部创建过程封装在工厂类中,由工厂类向客户端提供最终的产品;
而建造者模式中,建造者类一般只提供产品类中各个组件的建造,而将完整建造过程交付给导演类,
由导演类负责将各个组件按照特定的规则组建为产品,然后将组建好的产品交付给客户端。

让一个类似“导演”的角色负责车子组装,而具体造什么样的车需要什么样的零部件让具体的“构造者”去实现
  1 <?php
  2 
  3 /**
  4  * 需求就是我需要一件代步的工具,好让我不用自己跑过去,你帮我造一个吧
  5  */
  6 
  7 /**
  8  * 监工,控制配件的装卸顺序,还有装卸时间
  9  */
 10 class Director
 11 {
 12     public function build(Builder $builder)
 13     {
 14         $builder->createTravelTool();
 15         $builder->addWheel();
 16         $builder->addDoor();
 17         $builder->addEngine();
 18 
 19         return $builder->getTravelTool();
 20     }
 21 }
 22 
 23 
 24 /* 这些是具体的抽象类,一件物品一个类 */
 25 
 26 /**
 27  * 轮子
 28  */
 29 class Wheel
 30 {
 31     private $_name = "我是一个轮子";
 32 
 33     public function __toString()
 34     {
 35         return "<br/>{$this->_name}<br/>";
 36     }
 37 }
 38 
 39 /**
 40  * 车门
 41  */
 42 class Door
 43 {
 44     private $_name = "我是一扇车门";
 45 
 46     public function __toString()
 47     {
 48         return "<br/>{$this->_name}<br/>";
 49     }
 50 }
 51 
 52 /**
 53  * 引擎
 54  */
 55 class Engine
 56 {
 57     private $_name = "我是一个引擎";
 58 
 59     public function __toString()
 60     {
 61         return "<br/>{$this->_name}<br/>";
 62     }
 63 }
 64 
 65 /**
 66  * 卡车
 67  */
 68 class Trunk extends TravelTool
 69 {
 70     public function __construct()
 71     {
 72         $this->_name = "我是一辆卡车";
 73     }
 74 }
 75 
 76 /**
 77  * 小轿车
 78  */
 79 class Car extends TravelTool
 80 {
 81     public function __construct()
 82     {
 83         $this->_name = "我是一辆小轿车";
 84     }
 85 }
 86 
 87 /**
 88  * 因为卡车和小轿车有共同的部分,可以集中在一起,所以需要一个抽象类来做共同的部分
 89  */
 90 abstract class TravelTool
 91 {
 92     protected $_name;
 93 
 94     public function __toString()
 95     {
 96         return "<br/>{$this->_name}<br/>";
 97     }
 98 
 99     public function assemble($class, $positon='')
100     {
101         echo $class,"位置:".$positon."<br/>";
102     }
103 }
104 
105 
106 
107 /* 这些是具体的建造者,可以理解为组装车间,而Director就是监工,Director需要车间才能完成组装 */
108 
109 /**
110  * 车间, 里面说明这样的车间应该有什么东西
111  */
112 interface Builder
113 {
114     public function addWheel();             //这个车间要可以装卸轮子
115     public function addDoor();              //要可以装卸车门
116     public function addEngine();            //要可以装卸引擎
117     public function createTravelTool();     //要可以装卸基本的框架
118     public function getTravelTool();        //要能把装配好的工具运送出去
119 }
120 
121 /**
122  * 卡车组装车间
123  */
124 class TruckBuilder implements Builder
125 {
126     private $travelTool;
127 
128     public function addWheel()
129     {
130         $wheel = new Wheel();
131         $this->travelTool->assemble($wheel, 'left front');
132         $this->travelTool->assemble($wheel, 'left backend');
133         $this->travelTool->assemble($wheel, 'right front');
134         $this->travelTool->assemble($wheel, 'right backend');
135     }
136 
137     public function addDoor()
138     {
139         $this->travelTool->assemble(new Door(), 'left front');
140         $this->travelTool->assemble(new Door(), 'left backend');
141         $this->travelTool->assemble(new Door(), 'right front');
142         $this->travelTool->assemble(new Door(), 'right backend');
143     }
144 
145     public function addEngine()
146     {
147         $this->travelTool->assemble(new Engine());
148     }
149 
150     public function createTravelTool()
151     {
152         $this->travelTool = new Trunk();
153     }
154 
155     public function getTravelTool()
156     {
157         return $this->travelTool;
158     }
159 }
160 
161 /**
162  * 小轿车组装车间
163  */
164 class CarBuilder implements Builder
165 {
166     private $travelTool;
167 
168     public function addWheel()
169     {
170         $this->travelTool->assemble(new Wheel(), 'left front');
171         $this->travelTool->assemble(new Wheel(), 'left backend');
172         $this->travelTool->assemble(new Wheel(), 'right front');
173         $this->travelTool->assemble(new Wheel(), 'right backend');
174     }
175 
176     public function addDoor()
177     {
178         $this->travelTool->assemble(new Door(), 'left front');
179         $this->travelTool->assemble(new Door(), 'left backend');
180         $this->travelTool->assemble(new Door(), 'right front');
181         $this->travelTool->assemble(new Door(), 'right backend');
182     }
183 
184     public function addEngine()
185     {
186         $this->travelTool->assemble(new Engine());
187     }
188 
189     public function createTravelTool()
190     {
191         $this->travelTool = new Car();
192     }
193 
194     public function getTravelTool()
195     {
196         return $this->travelTool;
197     }
198 }
199 
200 
201 
202 
203 
204 //test
205 $t = new TruckBuilder();
206 $c = new CarBuilder();
207 $d = new Director();
208 
209 echo "Trunk Builder<br/>";
210 $trunk = $d->build($t);
211 echo $trunk;
212 
213 echo "<br/><br/>Car Builder<br/>";
214 $car = $d->build($c);
215 echo $car;
View Code
原文地址:https://www.cnblogs.com/hangtt/p/6256475.html