爱程序网

php设计模式 — 建造者模式

来源: 阅读:

需求分析:

我们接到了一个订单,是宝马公司和奔驰公司的,他们负责定义产品的零部件以及型号,我们负责生产,需求简单的描述就是这样。 我们需要为这个需求设计一个设计模式去更好的适应他们的需求。

首先我们需要一个车模型类,来定义好需要的所有零部件,这就叫做抽象类,之所以这样是因为我们还有可能接到更多公司的订单,比如劳斯莱斯,宾利。

然后由各自的车来继承这个抽象类,实现里面的方法。 

接下来就需要一个建造者抽象类,来定义建造各自的车需要的方法

然后由各自车建造者来继承这个抽象类。

我们会想到一个建造模式了,不错,就是建造者模式。用它简直太合适了。看一下建造者的用例图

请注意:此图示例方法部分和我的示例对不上哦。 

直接上代码:

  1 <?php  2   3 abstract class carModel{  4   5     //这里存储所有组装车需要的零件  6     public $spareParts = array();  7   8     //车的名字  9     public $carName = ""; 10  11     //增加轮子部件 12     public abstract function addLunzi($xinghao); 13  14     //增加外壳部件 15     public abstract function addWaike($xinghao); 16  17     //增加发动机部件 18     public abstract function addFadongji($xinghao); 19  20     //获取车,并给车取名字 21     final public function getCar($carName){ 22         if($this->spareParts){ 23             $this->carName = $carName; 24             //$k 代表部件名字 25             //$v 代表型号 26             foreach($this->spareParts as $k=>$v){ 27                 $actionName = "add" . $k; 28                 $this->$actionName($v);  29             } 30         }else{ 31             throw new Exception("没有汽车部件"); 32              33         } 34     } 35 } 36  37  38 //定义具体的产品 39 class bmwCarModel extends carModel{ 40  41     public $spareParts = array(); 42     public $carName = ""; 43  44     public function addLunzi($xinghao){ 45         echo "宝马".$this->carName."的轮子,型号是" . $xinghao . "n"; 46     } 47  48     public function addWaike($xinghao){ 49         echo "宝马".$this->carName."的外壳,型号是" . $xinghao . "n"; 50     } 51  52     public function addFadongji($xinghao){ 53         echo "宝马".$this->carName."的发动机,型号是 " . $xinghao . "n"; 54     } 55 } 56  57  58 //定义具体的产品 59 class benziCarModel extends carModel{ 60  61     public $spareParts = array(); 62     public $carName = ""; 63  64     public function addLunzi($xinghao){ 65         echo "奔驰".$this->carName."的轮子,型号是" . $xinghao . "n"; 66     } 67  68     public function addWaike($xinghao){ 69         echo "奔驰".$this->carName."的外壳,型号是" . $xinghao . "n"; 70     } 71  72     public function addFadongji($xinghao){ 73         echo "奔驰".$this->carName."的发动机,型号是 " . $xinghao . "n"; 74     } 75 } 76  77  78  79 //定义建造者 80 abstract class carBuilder{ 81     public abstract function setSpareParts($partsName , $xinghao); 82  83     public abstract function getCarModel($name); 84 } 85  86  87 class bmwBuilder extends carBuilder{ 88     private $bmwModel; 89  90     public function __construct(){ 91         $this->bmwModel = new bmwCarModel(); 92     } 93  94     public function setSpareParts($partsName , $xinghao){ 95         $this->bmwModel->spareParts[$partsName] = $xinghao; 96     } 97  98     public function getCarModel($name){ 99         $this->bmwModel->getCar($name);100     }101 }102 103 104 class benziBuilder extends carBuilder{105     private $benziModel;106 107     public function __construct(){108         $this->benziModel = new benziCarModel();109     }110 111     public function setSpareParts($partsName , $xinghao){112         $this->bmwModel->spareParts[$partsName] = $xinghao;113     }114 115     public function getCarModel($name){116         $this->bmwModel->getCar($name);117     }118 }119 120 121 122 //模拟客户端调用123 124 //创建一辆宝马车,取名字为宝马x1125 126 $bmwBuilder = new bmwBuilder();127 $bmwBuilder->setSpareParts('Lunzi' , '牛逼轮子1号');128 $bmwBuilder->setSpareParts('Waike' , '牛逼外壳1号');129 $bmwBuilder->setSpareParts('Fadongji' , '牛逼发动机1号');130 $bmwBuilder->getCarModel("宝马x1"); 131 $bmwBuilder->getCarModel("宝马x1");  //连续创建两个宝马x1132 133 //再创建一个宝马 没有外壳 取名为 宝马s5134 $bmwBuilder = new bmwBuilder();135 $bmwBuilder->setSpareParts('Lunzi' , '牛逼轮子2号');136 $bmwBuilder->setSpareParts('Fadongji' , '牛逼发动机2号');137 $bmwBuilder->getCarModel("宝马s5"); 138 $bmwBuilder->getCarModel("宝马s5");  //连续创建两个宝马x1