您的位置:首页 > 产品设计 > UI/UE

设计模式 一 创建者模式 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实例



设计模式目录
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: