美文网首页我爱编程
php设计模式之建造者模式

php设计模式之建造者模式

作者: 小山人 | 来源:发表于2018-06-21 11:45 被阅读0次

    建造者模式

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

    相关文章

      网友评论

        本文标题:php设计模式之建造者模式

        本文链接:https://www.haomeiwen.com/subject/steqyftx.html