关闭

设计模式 一 创建者模式 Builder(生成器)

423人阅读 评论(0) 收藏 举报
<?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实例



设计模式目录


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:97953次
    • 积分:1535
    • 等级:
    • 排名:千里之外
    • 原创:54篇
    • 转载:58篇
    • 译文:0篇
    • 评论:2条
    最新评论