PHP设计模式(三)建造者模式Builder实例详解【创(3)

抽象建造者:

 /**
 * 抽象建造者
 *
 */
 abstract class Builder
 {
 /**
  * 创建产品的第一部分
   */
 public abstract function buildPart1();
 
 /**
  * 
  * 创建产品的第二部分
   */
 public abstract function buildPart2();
 
 /**
  * 
  * 返回产品
   */
 public abstract function getProduct();
 }

具体建造者类:

/**
 * 具体建造者类:餐馆员工,返回的套餐是:汉堡两个+饮料一个
 *
 */
 class ConcreteBuilder1 extends Builder
 {
 protected $_product = null;//产品对象
 function __construct(){
  $this->_product = new Product();
 }
 
 /**
  * 创建产品的第一部分::汉堡=2
   */
 public function buildPart1()
 {
  $this->_product->add('Hamburger',2);
 }
 /**
  * 
  * 创建产品的第二部分:
   */
 public function buildPart2()
 {
  $this->_product->add('Drink', 1);
 }
 /**
  * 返回产品对象 :
  * 
  */
 public function getProduct() {
  return $this->_product;
 }
 }
/**
 * 具体建造者类:餐馆员工,汉堡1个+饮料2个
 *
 */
 class ConcreteBuilder2 extends Builder
 {
 protected $_product = null;//产品对象
 function __construct(){
  $this->_product = new Product();
 }
 
 /**
  * 创建产品的第一部分:汉堡
   */
 public function buildPart1()
 {
  $this->_product->add('Hamburger', 1);
 }
 /**
  * 
  * 创建产品的第二部分:drink=2
   */
 public function buildPart2()
 {
  $this->_product->add('Drink', 2);
 }
 /**
  * 返回产品对象 :
  * 
  */
 public function getProduct() {
  return $this->_product;
 }
 }

产品类:

/**
 * 产品类
 */
 class Product
 {
 public $products = array();
 /**
  * 添加具体产品
  */
 public function add($name, $value) {
  $this->products[$name] = $value;
 }
 /**
  * 给顾客查看产品
  */
 public function showToClient()
 {
  foreach ($this->products as $key => $v) {
  echo $key , '=' , $v ,'<br>';
  }
 }
 }

客户程序:

 //客户程序
 class Client
 {
 /**
  * 顾客购买套餐
  *
  */
 public function buy($type) {
  //指导者,收银员
  $director = new DirectorCashier(); 
  //餐馆员工,收银员
     $class = new ReflectionClass('ConcreteBuilder' .$type );
     $concreteBuilder = $class->newInstanceArgs();
     //收银员组合员工返回的食物
     $director->buildFood($concreteBuilder);
     //返回给顾客
     $concreteBuilder->getProduct()->showToClient();
 }
 }
 //测试
 ini_set('display_errors', 'On');
 $c = new Client();
 $c->buy(1);//购买套餐1
 $c->buy(2);//购买套餐1

9. 建造者模式的优点

       首先,建造者模式的封装性很好。使用建造者模式可以有效的封装变化,在使用建造者模式的场景中,一般产品类和建造者类是比较稳定的,因此,将主要的业务逻辑封装在导演类中对整体而言可以取得比较好的稳定性。