海角不转弯

代码是梦想的砖

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

建造模式是对象的创建模式,建造模式可以将一个产品的内部表象和产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。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();
View Code

 

建造模式与抽象工厂模式的比较

两者都是用来创建同事属于几个产品族的对象的模式。

在抽象工厂模式中,每一次工厂对象被调用时都会返回一个完整的产品对象,而客户端有可能会决定把这些产品组装成一个更大更复杂的产品,也有可能不会。建造类则不同,它一点一点地建造出一个复杂的产品,而这个产品的组装过程就发送在建造者角色内部。建造者模式的客户端拿到的是一个完整的最后产品。虽说两者都是设计模式,但是抽象工厂模式处在更加具体的尺度上,而建造者模式则处于更加宏观的尺度上。

比如众神造人:女娲利用建造模式负责把灵魂、耳目、手臂等组合成一个完整的人,而黄帝、上骈、桑林各自利用工厂模式创造出灵魂耳目手臂等。女娲不必考虑灵魂耳目手臂是什么样子,怎么创造出来的。

 

建造模式与策略模式:建造模式是策略模式的一种特殊情况。这两种模式的不同在于他们的用意不同。建造模式适用于为客户端一点一点地建造出新的对象,而不同类型的具体建造者角色虽然拥有相同的接口,但是它们所创造的出来的对象可能完全不同。

策略模式的目的是为了算法提供抽象的接口,换言之。一个具体策略类把一个算法包装到一个对象里面,而不同的具体策略对象为一种一般性的服务提供不同的实现。

在以下情况下应当使用建造模式:

1、需要生成的产品对象有复杂的的内部结构,每个内部成分本身可能是对象,也可以是一个对象的组成部分。

2.需要生产的产品对象的属性相互依赖,建造模式可以强制实行一种分步骤进行的建造过程,因此如果产品对象的一个属性必须在另一个属性被赋值之后才可以被赋值使用建造者模式是一个很好的设计思想。

 

 

 

posted on 2013-05-19 20:48  海角不转弯  阅读(186)  评论(0编辑  收藏  举报