注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Copper peas ' Bolg

Keep On Moving...This Is My Life...

 
 
 

日志

 
 

【原】 PHP 设计模式十之建造者设计模式  

2011-06-13 15:14:22|  分类: php |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

<?php
header("Content-type:text/html; charset=utf-8");
/**
 * 组装电脑 建造者设计模式
 * 定义:将一个复杂对象的构建和它的表示 分离,使得同样的构建过程可以创建不同的表示
 * @anthor Chen Wei Han <csq-3@163.com>
 * @copyright Chen Wei Han 2011-6-13上午11:26:49
 * @link http://csq-3.blog.163.com
 * @package demo
 * @version 1.0 builder.php
 */

/**
 * 抽象产品角色类
 */
abstract class abstract_Product
{
 abstract public function product();
}

/**
 * 具体产品类 主机产品
 */
class ComputerMainframe extends abstract_Product
{
 public function product()
 {
  return  "电脑主机产品";
 }
}

/**
 * 具体产品类 液晶显示器
 */
class LCD extends abstract_Product
{
 public function product()
 {
  return "电脑液晶显示器产品";
 }
}

/**
 *  具体产品类 台式显示器
 */
class DonsoleDisplay extends abstract_Product
{
 public function product()
 {
  return "电脑台式显示器产品";
 }
}

/**
 * 具体产品类 键盘鼠标
 */
class KeyboardMouse extends abstract_Product
{
    public function product()
    {
     return "电脑键盘鼠标";
    }
}

/**************************************************************/

/**
 * 抽象建造者类 (组装电脑产品必须部件)
 */
abstract class abstract_Builder
{
 abstract public function partA();
 abstract public function partB();
 abstract public function partC();
 abstract public function GetResult();

 
}

/**
 * 具体建造者 台式显示机产品
 */
class DonsoleC extends abstract_Builder
{

 private $product;
 
    public function __construct()
    {
       $this->product = new ProductBuider();
    }

    public function partA()
    {
        $this->product->Add(new ComputerMainframe()); 
    }
   
    public function partB()
    {
       $this->product->Add(new DonsoleDisplay());  
    }
   
    public function partC()
    {
       $this->product->Add(new KeyboardMouse());  
    }
   
    public function GetResult()
    {
     return $this->product;
    } 
}

/**
 * 具体建造者 液晶显示式机产品
 */
class LCDC extends abstract_Builder
{

 private $product;
 
    public function __construct()
    {
       $this->product = new ProductBuider();
    }

    public function partA()
    {
        $this->product->Add(new ComputerMainframe()); 
    }
   
    public function partB()
    {
       $this->product->Add(new LCD());  
    }
   
    public function partC()
    {
       $this->product->Add(new KeyboardMouse());  
    }
   
    public function GetResult()
    {
     return $this->product;
    } 
}


/**
 * 需要的复杂对象
 */
class ProductBuider
{
  private $parts = array();

  public function Add($part)
  {
      $this->parts[] = $part;
  }
 
  public function Show()
  {
    foreach($this->parts as $value)
    { 
     echo $value->product()."<br>";
    }
  }

}
/**
 *  建造指挥者类
 */
class Director
{
  public function Construct($builder)
  {
     $builder->PartA();
     $builder->PartB();
     $builder->PartC();
  }
}


$director = new Director();
$b1 = new DonsoleC();
$b2 = new LCDC();

//显示台式机
$director->Construct($b1);
$p1 = $b1->GetResult();
$p1->Show();
echo "<br>";
//液晶台式机
$director->Construct($b2);
$p1 = $b2->GetResult();
$p1->Show();

/**
 * 注:如果需要其他产品,只需要增加一个建造者的具体实现类,不需要修改其他地方,满足开放关闭原则
 * 上面的例子等于是 需要产品先告诉建造者类,他会激活对应的产品负责生产,然后把需要的组装的部分装进一个容器,统一输出。
 * 也就等于去小吃店  你告诉收银员,我要吃鸡汤面,然后收银员会告诉厨师做一碗鸡汤面,厨师会把鸡汤和面都装进碗里,然后一整碗面就摆在你面前了。
 * 这里收银员就是指挥者 ,鸡汤面就是具体的建造者鸡汤类,碗就是数组容器,厨师就是输出
 *
 * 适用性:需要生成的产品对象有复杂的内部结构。
                    需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
                    在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。
                    建造者模式的实质是解耦组装过程和创建具体部件,使得我们不用去关心每个部件是如何组装的。
 */

  评论这张
 
阅读(85)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018