当前位置:首页 > 设计模式 > 正文内容

php中的建造型模式

phpmianshi9年前 (2012-04-10)设计模式139

概念

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

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


使用场景

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),建造者类一般只提供产品类中各个组件的建造,而将具体建造过程交付给导演类。由导演类负责将各个组件按照特定的规则组建为产品,然后将组建好的产品交付给客户端。


版权声明:本文由PHP面试资料网发布,如需转载请注明出处。
分享给朋友:

相关文章

对象池模式和注册树模式的区别和联系

区别对象池主在对象创建开销较大或要控制对象数量的时候使用。最常见的对象池应该是数据库连接池和线程池,例如程序需要数据库连接时从连接池中取一个(连接池里有多个连接),用完了不是关闭连接而是把连接放回连接...

php中的桥接模式

概念桥接模式 (Bridge Pattern):将抽象与实现解耦,使得两者可以独立的变化1,如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通...

php中享元模式

概念享元模式(Flyweight),为了节约内存的使用,享元模式会尽量使类似的对象共享内存。在大量类似对象被使用的情况中这是十分必要的。常用做法是在外部数据结构中保存类似对象的状态,并在需要时将他们传...

php中的状态模式

概念状态模式当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,...

php中的数据映射模式

概念数据对象映射模式,就是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作,数据映射模式使您能更好的组织你的应用程序与数据库进行交互。大家如果用过 thinkphp 这个框架,应该知...

Laravel中用到的设计模式

1:工厂模式Auth::user()此处Auth这个类就是工厂中的方法,Auth是注册树中的别名。好处:类似于函数的封装,使对象有一个统一的生成(实例化)入口。当我们对象所对应的类的类名发生变化的时候...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。