设计模式 一 创建者模式 Builder(生成器)
2012-03-31 15:43
330 查看
<?php /** * 设计模式 一 创建者模式 Builder(生成器) * 在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化, * 这个复杂对象的各个部分子对象经常面临着剧烈的变化,但是将它们组合在一起的算法绝对的稳定。 * 如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变? * * 这就是要说的建造者模式。 */ /* * 意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。 */ /** * 本节通过,现实生活中的买KFC例子,诠释建造者模式。 * 客户端(client):客户。想去买套餐(这里包括汉堡、可乐、薯条),可以有1套餐(普通),和2套餐(黄金)两种套餐提供选择。 * 指导员(director):收银员。知道顾客想要买什么样的套餐,并告诉餐馆员工去准备套餐。 * 建造者(builder) :餐馆员工。按照收银员的要求去准备具体的套餐,分别放入汉堡、可乐、薯条等。规范产品各个组成成分的建造(即规范具体建造者的实现方法) 其中所规范的方法中必须包含建造方法,和结果返回方法。 * 产品角色(product):最后的套餐。所有的东西放在同一个盘子里面。 */ /** * */ class Food { private $hamb; private $coke; private $chip; public function setHamb($hamb) { $this->hamb = $hamb; } public function getHamb() { return $this->hamb; } public function setCoke($coke) { $this->coke = $coke; } public function getCoke() { return $this->coke; } public function setChip($chip) { $this->chip = $chip; } public function getChip() { return $this->chip; } } abstract class Builder { //添加汉堡 public abstract function buildHamb(); //添加可乐 public abstract function buildCoke(); //添加薯条 public abstract function buildChip(); } class NormalBuilder extends Builder { private $food; function __construct() { $this->food = new food(); } public function buildHamb() { $this->food->setHamb(array('NormalHamb'=>"10.50")); } public function buildCoke() { $this->food->setCoke(array('CokeCole'=>"1.50")); } public function buildChip() { $this->food->setChip(array('FireChips'=>"7.5")); } public function getFood() { return $this->food; } } class GoldBuilder extends Builder { function __construct() { $this->food = new food(); } public function buildHamb() { $this->food->setHamb(array('GoldHamb'=>"15.50")); } public function buildCoke() { $this->food->setCoke(array('CokeCole'=>"1.50")); } public function buildChip() { $this->food->setChip(array('FireChips'=>"7.5")); } public function getFood() { return $this->food; } } class FoodManager { public function construct(Builder $builder) { $builder->buildHamb(); $builder->buildCoke(); $builder->buildChip(); } } $foodManager = new FoodManager(); $Builder = new GoldBuilder(); $foodManager->construct($Builder); $product = $Builder->getFood(); var_export($product); var_export($product->getHamb()); var_export($product->getCoke()); var_export($product->getChip()); /** * 总结 * 建造者模式可以让一个产品的内部表象和产品的生产过程分离开,从而可以生成具有不同内部表象的产品。 * 主要角色介绍 * 抽象建造者(Builder)角色:定义一个抽象接口,规范产品各个组成成分的建造(即规范具体建造者的方法实现)。其中所规范的方法中必须包括建造方法和结果返回方法。 * 具体建造者(ConcreteBuilder)角色:实现抽象建造者角色定义的方法。具体建造者与业务逻辑关联性比较大,应用程序最终会通过,调用此角色中的建造方法按照业务逻辑创建产品,在建造完成后通过结果返回产品实例。 * 导演者(Diretor)角色:此角色的作用是调用具体的创建者角色创造产品。导演者与产品类没直接关系。 * 产品(product)角色:在导演者指导下由具体建造者所创建的那个复杂的对象。 导演者角色与客户端直接打交道,它理解客户端的业务逻辑,将客户端创建产品的请求拆分成部分请求,然后调用具体产品角色执行建造操作。它分离了客户端与具体建造者。 */ /** * 优点: 1、建造者模式可以很好的将一个对象的实现与相关的“业务”逻辑分离开来,从而可以在不改变事件逻辑的前提下,是添加(或改变)实现变得非常容易。 2、允许对象通过多个步骤来创建,并且可以改变过程(这和只有一个步骤的工厂模式不同)。 3、向客户隐藏产品内部的表现。 4、产品的实现可以被替换,因为客户只能看到一个抽象接口。 * 缺点:建造者接口的修改会导致所有执行类的修改。 */ /** * 适用性 * 1、需要生产的产品对象有复杂的内部结构。比如,汽车、电脑。 * 2、需要生成的产品对象的属性互相依赖,建造者模式可以强迫生产顺序。 */ /** * 和其他模式的区别 * 1、抽象工厂模式:Builder模式返回完成的一个产品,而abstractFactory返回一系列有关系的产品。在抽象工厂模式中,客户采用abstractFactory生成自己要的 对象,而在Builder模式中,客户端指导(diretor)builder类如何去生成对象。获知如何合成一些类来构成建造类,侧重于一步一步构造一个复杂对象,然后返回结果。 2、原型模式:克隆,对象已经存在。 3、工厂方法:强调的是对象的变化,类实例推迟到子类。 4、单例:对象的唯一性。 */
建造者模式php实例
设计模式目录
相关文章推荐
- 【设计模式】创建型模式之生成器Builder
- 设计模式之--生成器(builder)模式(学习分析笔记)
- 设计模式-创建型-builder生成器
- 设计模式之五:BUILDER(生成器)—对象创建型模式
- 设计模式之BUILDER生成器2
- 设计模式----Builder(生成器)模式
- 设计模式----Builder(生成器)
- C# 设计模式-生成器(Builder)
- 设计模式之BUILDER(生成器)—对象创建型模式
- 设计模式学习笔记(四)——Builder生成器模式
- 设计模式学习--生成器BUILDER
- 设计模式----Builder(生成器)
- 设计模式深入学习-Builder生成器(创建型模式 )
- 设计模式----Builder(生成器)
- 设计模式:生成器模式(Builder Pattern)
- 设计模式之建造者模式(生成器模式、Builder)摘录
- c++ 设计模式之创建者(生成器)模式
- Objective-C设计模式——生成器Builder(对象创建)
- 设计模式之 创建者(Builder)模式(C++实现)
- java设计模式 之生成器模式 Builder