创建型模式---建造者模式

角色:

Builder:抽象建造者,提供建造产品某部分的方法
ConcreteBuilder:具体建造者,具体来建造产品中的某个部分
Director:指挥者,实现建造者模式的接口,选择具体建造者来创建具体的产品
Product:产品

样例

抽象建造者Builder.php

<?php
/**
 * Created by PhpStorm.
 * User: 何晓宏
 * Date: 2018/9/28
 * Time: 15:34
 */
namespace Builderpattern;

abstract class Builder{

    protected $_Food;

    function __construct()
    {
        $this->_Food=new Food();
    }

    abstract function addoil();

    abstract function addfood();

    abstract function addsalt();

    abstract function getFood();

}

具体建造者

<?php
/**
 * Created by PhpStorm.
 * User: 何晓宏
 * Date: 2018/9/28
 * Time: 15:35
 */
namespace Builderpattern;
class Builder1 extends Builder{

    function addoil()
    {
        $this->_Food->_one="加油";
    }

    function addfood()
    {
        $this->_Food->_two="加菜";
    }

    function addsalt()
    {
        $this->_Food->_three="加盐";
    }

    function getFood()
    {
        return $this->_Food;
    }
}
<?php
/**
 * Created by PhpStorm.
 * User: 何晓宏
 * Date: 2018/9/28
 * Time: 15:36
 */
namespace Builderpattern;
class Builder2 extends Builder{

    function addoil()
    {
        $this->_Food->_one="加油";
    }

    function addfood()
    {
        $this->_Food->_two="加肉";
    }

    function addsalt()
    {
        $this->_Food->_three="加盐";
    }

    function getFood()
    {
        return $this->_Food;
    }
}

指挥者Cook.php

<?php
/**
 * Created by PhpStorm.
 * User: 何晓宏
 * Date: 2018/9/28
 * Time: 15:35
 */
namespace Builderpattern;
class Cook{
    public function build($builder)
    {
        $builder->addoil();
        $builder->addfood();
        $builder->addsalt();
        
        return $builder->getFood();
    }
}

产品 Food.php

<?php
/**
 * Created by PhpStorm.
 * User: 何晓宏
 * Date: 2018/9/28
 * Time: 15:34
 */
namespace Builderpattern;
class Food{
    public $_one;
    public $_two;
    public $_three;

    function CookProcess(){
        echo "{$this->_one}";
        echo "{$this->_two}";
        echo "{$this->_three}\n";
    }

}

客户端

$cook1=new \Builderpattern\Cook();
echo "炒菜步骤:";
$food1=$cook1->build(new \Builderpattern\Builder1());
$food1->CookProcess();

$cook2=new \Builderpattern\Cook();
echo "炒肉步骤:";
$food2=$cook2->build(new \Builderpattern\Builder2());
$food2->CookProcess();

运行结果

优点

  • 隐藏了产品细节,将产品本身与产品的创建过程解耦,相同的创建过程可以创建不同的产品对象
  • 系统拓展方便,符合开闭原则,增加新的具体建造者无须修改原有类库的代码

缺点

  • 产品之间的创建需要很多共同点,产品之间差异很大的时候不适合使用

适合场景

  • 产品对象有复杂的内部结构
  • 产品对象属性相互依赖
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值