建造者模式以及php实现

 

建造者模式:
  造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

  建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。建造者模式属于对象创建型模式。根据中文翻译的不同,建造者模式又可以称为生成器模式。

 

目的:
  消除其他对象复杂的创建过程
建造者模式包含如下角色:
  1.产品角色,产品角色定义自身的组成属性
  2.抽象建造者,抽象建造者定义了产品的创建过程以及如何返回一个产品
  3.具体建造者,具体建造者实现了抽象建造者创建产品过程的方法,给产品的具体属性进行赋值定义
  4.指挥者,指挥者负责与调用客户端交互,决定创建什么样的产品

UML图:

 ../_images/Builder.jpg 

 

//代码实现:

<?php
class People{
    public $head;
    public $body;
    
    //不太此类中直接给属性赋值
    function __construct(){

    }
}

//定义具备建造者所需实现的方法
abstract class PeopleBuilder{
    abstract function buildHead();
    abstract function buildBody();
}

//具体建造类实现具体业务
class ChildBuilder extends PeopleBuilder{
    private $people;
    function __construct(){
        $this->people = new people;
    }

    function buildHead(){
       echo "this is a child's head!";
    }
    function buildBody(){
       echo "this is a child's body!";
    }
    function returnResult(){
       return $this->people;
    }
}

class AdultBuilder extends PeopleBuilder{
    private $people;
    function __construct(){
        $this->people = new people;
    }

    function buildHead(){
       echo "this is a adult's head!";
    }
    function buildBody(){
       echo "this is a adult's body!";
    }
    function returnResult(){
       return $this->people;
    }
}

//指挥者,指挥者负责与调用客户端交互,决定创建什么样的产品
class Director{
    function __construct(Peoplebuilder $builder){
        $builder->buildHead();
        $builder->buildBody(); 
    }
}


//测试
$builder = new AdultBuilder();  
$director = new Director($builder);  
$person = $builder->returnResult(); 
//this is a adult's head! this is a adult's body!
?>

 

 优点:
  建造者模式可以很好的将一个对象的实现与相关的“业务”逻辑分离开来,从而可以在不改变事件逻辑的前提下,使增加(或改变)实现变得非常容易。
缺点:
  建造者接口的修改会导致所有执行类的修改。
适用场景:
  1、 需要生成的产品对象有复杂的内部结构。
  2、 需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
  3、 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过 程中不易得到。
使用建造者模式主要有以下效果:
  1、 建造者模式的使用使得产品的内部表象可以独立的变化。使用建造者模式可以使客 户端不必知道产品内部组成的细节。
  2、 每一个Builder都相对独立,而与其它的Builder无关。
  3、 模式所建造的最终产品更易于控制。

posted on 2016-05-26 22:07  yujon  阅读(465)  评论(0编辑  收藏  举报

导航