建造者模式
建造者模式也成生成器模式,是将一个复杂对象的构造与他的表示分离,使同样的构建过程可以创建不同的表示
创建者模式一般认为有四个角色:
1 产品角色,产品角色定义自身的组成属性
2 抽象建造者,抽象建造者定义了产品的创建过程以及如何返回一个产品
3 具体建造者,具体建造者实现了抽象建造者创建过程的方法,给产品的具体属性进行赋值定义
4 指挥者,指挥者负责与调用客户端交互,决定创建什么样的产品
例如,有不同的产品,产品的名字,颜色,大小不同呢,通过不同呢的具体建造者创建不同属性的产品
目录结构
|builder #项目根目录
|--Think #核心类库
|----builder.php #抽象建造者类
|----director.php #指挥者
|----Loder.php #自动加载类
|----product.php #产品角色
|----productA.php #产品A建造者
|----productB.php #产品B建造者
|--index.php #单一的入口文件
代码实践
产品角色,定义产品属性 Think/product.php
<?php
/**
* 产品角色
*/
namespace Think;
class product{
public $name;
public $size;
public $color;
}
抽象建造者类 Think/builder.php
<?php
/**
* 抽象建造者类
*/
namespace Think;
abstract class builder{
protected $_product;
public function __construct(product $product) {
$this->_product = $product;
}
abstract function setName();
abstract function setSize();
abstract function setColor();
public function getProduct() {
echo "产品名称:{$this->_product->name}\n";
echo "产品尺寸:{$this->_product->size}\n";
echo "产品颜色:{$this->_product->color}\n";
}
}
产品A建造者 Think/productA.php
<?php
/**
* 产品A建造者
*/
namespace Think;
class productA extends builder{
public function setName() {
$this->_product->name = 'A';
}
public function setSize() {
$this->_product->size = '10';
}
public function setColor() {
$this->_product->color = 'red';
}
}
产品B建造者 Think/productB.php
<?php
/**
* 产品B建造者
*/
namespace Think;
class productB extends builder{
public function setName() {
$this->_product->name = 'B';
}
public function setSize() {
$this->_product->size = '12';
}
public function setColor() {
$this->_product->color = 'blue';
}
}
指挥者 Think/director.php
<?php
/**
* 指挥者
*/
namespace Think;
class director{
public function show(builder $builder) {
$builder->setName();
$builder->setSize();
$builder->setColor();
}
}
自动加载 Think/Loder.php
<?php
namespace Think;
class Loder{
static function autoload($class){
require BASEDIR . '/' .str_replace('\\','/',$class) . '.php';
}
}
index.php入口文件
<?php
define('BASEDIR',__DIR__);
include BASEDIR . '/Think/Loder.php';
spl_autoload_register('\\Think\\Loder::autoload');
//实例化产品B
$productB = new \Think\productB(new \Think\product());
//实例化建造指挥者
$director = new \Think\director();
//指挥建造
$director->show($productB);
//得到产品B
$B = $productB->getProduct();
上一篇 php设计模式之装饰器模式
下一篇 php设计模式之原型模式