建造模式是对象的创建模式,建造模式可以将一个产品的内部表象和产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。Mailer()类使用的就是建造模式。设计到Builer以及Director,Product等。
下面以一个案例说明:(以下案例是针对两个不同的建造者-)
1 /** 2 * 3 * 建造者模式 ... 4 * @author Lujianchao 5 * 6 */ 7 8 /** 9 * 10 * Director 11 * @author Lujianchao 12 * 13 */ 14 15 class Director{ 16 17 protected $builer; 18 protected $configs; 19 /** 20 * 21 * 初始化导演类 22 * @param $builer 23 24 */ 25 26 public function __construct(Builer $builder){ 27 $this->builer=$builder; 28 } 29 30 /** 31 * 这里用来指导建造工序 32 * @param $configs 33 */ 34 public function build($configs){ 35 36 $this->builer->setBody($configs['body']); 37 $this->builer->setFooter($configs['footer']); 38 $this->builer->setHeader($configs['header']); 39 /** 40 * 返回 41 */ 42 43 } 44 45 public function getProduct(){ 46 47 echo $this->builer->getRobot(); 48 49 50 } 51 52 53 } 54 /** 55 * 56 * 抽象类Buider 57 * @author Lujianchao 58 * 59 */ 60 abstract class Builer{ 61 62 protected $header; 63 protected $footer; 64 protected $body; 65 66 public function setHeader($header){} 67 public function setBody($body){} 68 public function setFooter($footer){} 69 70 public function getRobot(){ } 71 } 72 73 74 /** 75 * cleanRobotBuilder 76 */ 77 78 class CleanRobotBuiler extends Builer{ 79 80 public function setHeader($header){ 81 82 $this->header=$header; 83 84 } 85 public function setBody($body){ 86 87 $this->body=$body; 88 } 89 public function setFooter($footer){ 90 91 $this->footer=$footer; 92 } 93 94 public function getRobot(){ 95 96 return "I am a cleanRobot ! body:{$this->body},footer:{$this->footer},header:{$this->header}"; 97 98 } 99 100 } 101 102 103 /** 104 * mealRobotBuilder 105 */ 106 107 class MealRobotBuiler extends Builer{ 108 109 public function setHeader($header){ 110 111 $this->header=$header; 112 113 } 114 public function setBody($body){ 115 116 $this->body=$body; 117 } 118 public function setFooter($footer){ 119 120 $this->footer=$footer; 121 } 122 123 public function getRobot(){ 124 125 return "I am a mealRobot ! body:{$this->body},footer:{$this->footer},header:{$this->header}"; 126 127 } 128 129 } 130 131 132 class Client{ 133 134 /** 135 * 136 * 客户端 ... 137 */ 138 139 public static function main(){ 140 141 $builder=new CleanRobotBuiler(); 142 143 $configs=array('footer'=>'circle','body'=>'machinekey','header'=>'tianxian'); 144 145 $direct=new Director($builder); 146 147 $direct->build($configs); 148 149 $direct->getProduct(); 150 151 152 153 } 154 155 } 156 157 Client::main();
建造模式与抽象工厂模式的比较
两者都是用来创建同事属于几个产品族的对象的模式。
在抽象工厂模式中,每一次工厂对象被调用时都会返回一个完整的产品对象,而客户端有可能会决定把这些产品组装成一个更大更复杂的产品,也有可能不会。建造类则不同,它一点一点地建造出一个复杂的产品,而这个产品的组装过程就发送在建造者角色内部。建造者模式的客户端拿到的是一个完整的最后产品。虽说两者都是设计模式,但是抽象工厂模式处在更加具体的尺度上,而建造者模式则处于更加宏观的尺度上。
比如众神造人:女娲利用建造模式负责把灵魂、耳目、手臂等组合成一个完整的人,而黄帝、上骈、桑林各自利用工厂模式创造出灵魂耳目手臂等。女娲不必考虑灵魂耳目手臂是什么样子,怎么创造出来的。
建造模式与策略模式:建造模式是策略模式的一种特殊情况。这两种模式的不同在于他们的用意不同。建造模式适用于为客户端一点一点地建造出新的对象,而不同类型的具体建造者角色虽然拥有相同的接口,但是它们所创造的出来的对象可能完全不同。
策略模式的目的是为了算法提供抽象的接口,换言之。一个具体策略类把一个算法包装到一个对象里面,而不同的具体策略对象为一种一般性的服务提供不同的实现。
在以下情况下应当使用建造模式:
1、需要生成的产品对象有复杂的的内部结构,每个内部成分本身可能是对象,也可以是一个对象的组成部分。
2.需要生产的产品对象的属性相互依赖,建造模式可以强制实行一种分步骤进行的建造过程,因此如果产品对象的一个属性必须在另一个属性被赋值之后才可以被赋值使用建造者模式是一个很好的设计思想。