zoukankan      html  css  js  c++  java
  • 建造者模式

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

    让一个类似“导演”的角色负责车子组装,而具体造什么样的车需要什么样的零部件让具体的“构造者”去实现
      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
  • 相关阅读:
    为民服务贴——提供学习交流的其他比较好的平台
    【转】Web服务软件工厂
    【转】在 SQL Server 2005 中使用表值函数来实现空间数据库
    回家过年(春联)
    ArcGIS Server9.2学习开发(2)——安装配置篇
    烦困人间 游戏生活
    ArcGIS Server9.2学习开发(6)——使用Navigation、ZoomLevel和ScaleBar控件
    【转】激活 ActiveX 控件
    用Eclipse写java
    无题
  • 原文地址:https://www.cnblogs.com/hangtt/p/6256475.html
Copyright © 2011-2022 走看看