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

<?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模式中要好好把握如下几点 1. 需要创建的对象是复杂对象 2. 对象的创建过程是一步步创建(即:可能由于过程的不同而导致有不同的对象展示) 3. 明确建造者(Builder)、具体建造者(Concrete Builder)、指导者(Director)、产品(Product)之间的职责和联系。 ◆建造者(Builder): 给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。模式中直接创建产品对象的是 具体建造者(ConcreteBuilder):具体建造者类必须实现这个接口所要求的方法:一个是建造方法,另一个是结果返还方法。 ◆具体建造者(Concrete Builder): 担任这个角色的是于应用程序紧密相关的类,它们在应用程序调用下创建产品实例。这个角色主要完成的任务包括: ■实现Builder角色提供的接口,一步一步完成创建产品实例的过程。 ■在建造过程完成后,提供产品的实例。 ◆指导者(Director): 担任这个角色的类调用具体建造者角色以创建产品对象。导演者并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者对象。 ◆产品(Product): 产品便是建造中的复杂对象。 详细见博客 http://blog.csdn.net/xiaoting451292510/article/details/8330462
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值