php设计模式之建造者模式

建造者模式

建造者模式也成生成器模式,是将一个复杂对象的构造与他的表示分离,使同样的构建过程可以创建不同的表示
创建者模式一般认为有四个角色:
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设计模式之原型模式

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容