角色:
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();
运行结果
优点
- 隐藏了产品细节,将产品本身与产品的创建过程解耦,相同的创建过程可以创建不同的产品对象
- 系统拓展方便,符合开闭原则,增加新的具体建造者无须修改原有类库的代码
缺点
- 产品之间的创建需要很多共同点,产品之间差异很大的时候不适合使用
适合场景
- 产品对象有复杂的内部结构
- 产品对象属性相互依赖