首页 > 模式算法 > php中的建造型模式
2012
04-10

php中的建造型模式

概念

也叫生成器模式,建造型模式用于创建过程稳定,但配置多变的对象。在《设计模式》一书中的定义是:将一个复杂的构建与其表示相分离使得同样的构建过程可以创建不同的表示

建造者模式主要用来通过链式调用生成不同的配置。


使用场景

1. 需要生成的产品对象有复杂的内部结构。

2. 需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。

3. 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。


优势

1. 建造者模式的使用使得产品的内部表象可以独立的变化。使用建造者模式可以使客户端不必知道产品内部组成的细节。

2. 每一个Builder都相对独立,而与其它的Builder(独立控制逻辑)无关。

3. 模式所建造的最终产品更易于控制。


缺点

1. 建造者接口的修改会导致所有执行类的修改。

示例

<?php

/**
 * 定义一个动物模型类
 */
abstract class PetModel
{
    /**
     * 动物名字
     *
     * @var string
     */
    public $petname = '';

    /**
     * 动物会的技能
     *
     * @var array
     */
    public $petskills = [];

    /**
     * 会唱歌
     *
     * @access public
     */
    public abstract function skillsSing();

    /**
     * 会跳舞
     *
     * @access public
     */
    public abstract function skillsDance();

    /**
     * 会跑步
     *
     * @access public
     */
    public abstract function skillsRunning();

    /**
     * 获取动物
     *
     * @access public
     * @return void
     */
    final public function getPet($petname)
    {
        // 获取动物名称
        $this->petname = $petname;

        if (!empty($this->petskills)) {
            // 赋值技能
            foreach ($this->petskills as $value) {
                // 获取技能名称
                $skillName = 'skills' . $value;
                // 执行方法
                $this->$skillName();
            }
        }
    }
}

/**
 * 狗类
 */
class DogPetModel extends PetModel
{
    /**
     * 技能栏
     *
     * @var array
     */
    public $petskills = [];

    /**
     * 唱歌
     *
     * @access public
     */
    public function skillsSing()
    {
        echo $this->petname . '会唱歌<br>';
    }

    /**
     * 跳舞
     *
     * @access public
     */
    public function skillsDance()
    {
        echo $this->petname . '会跳舞<br>';
    }

    /**
     * 跑步
     *
     * @access public
     */
    public function skillsRunning()
    {
        echo $this->petname . '会跑步<br>';
    }
}

/**
 * 定义建造者
 */
abstract class PetBuilder
{
    /**
     * 获取模型
     *
     * @access public
     * @param string $name 动物名称
     * @param array $skills 动物能力
     */
    public abstract function getPetModel($name, $skills);
}

/**
 * 狗类
 */
class DogPetBuilder extends PetBuilder
{
    /**
     * 设置保存实例的变量
     *
     * @var self
     */
    private $model = '';

    /**
     * 构造函数
     *
     * @access public
     * @return void
     */
    public function __construct()
    {
        // 实例化类
        $this->dogPetModel = new DogPetModel();
    }

    /**
     * 获取动物实例
     *
     * @access public
     * @param string $name 动物名称
     * @param array $skills 动物能力
     * @return void
     */
    public function getPetModel($name, $skills = [])
    {
        // 赋值能力
        $this->dogPetModel->petskills = $skills;
        // 实例化动物
        $this->dogPetModel->getPet($name);
    }
}

// 实例化 Dog 建造者类
$dog = new DogPetBuilder();
// 获取第一只小狗
$dog1 = $dog->getPetModel('Dog1', [
    'Sing',
    'Dance',
    'Running'
]);

// 获取第二只小狗
$dog2 = $dog->getPetModel('Dog2', [
    'Sing',
    'Dance'
]);


从这里我们可以看出,建造者模式,跟工厂模式很相似,只是比工厂模式仅仅多了一个“导演类”的角色(Director,也就是代码中的 PetModel 抽象类)。那为什么还要有建造者模式呢?

建造者模式主要是用来创建更为复杂的对象,因为对象的创建过程更为复杂,所以需要一个新的导演类(Director),建造者类一般只提供产品类中各个组件的建造,而将具体建造过程交付给导演类。由导演类负责将各个组件按照特定的规则组建为产品,然后将组建好的产品交付给客户端。


本文》有 0 条评论

留下一个回复