zoukankan      html  css  js  c++  java
  • 设计模式之建造者模式(php实现)

    github地址:https://github.com/ZQCard/design_pattern
    /*
    * * 建造者模式 * 将一个复杂对象的建造与调用者分离。调用者只需要给出指定对象的类型和内容,建造者模式负责按照顺寻创建复杂对象. * 以买汽车为例,工厂负责制造汽车,你可以购买你所需要的汽车品牌和型号 * 指挥者(Director):将复杂对象划分为各个详情对象的建造请求(厂长) * 建造请求(Builder):将复杂对象划分为各个详情对象的建造请求(轮子、座椅、发动机) * 具体的建造者:建造属于自己的产品部件(轮子制造人,座椅制造人,发动机制造人) * 优点:易于解耦,将产品本身与创建的过程分离,可以使用相同的创建过程来创建不同的产品. * 易于精确的控制对象,将复杂对象的创建划分在不同的方法中,创建过程更加清晰 * 易于扩展,增加新的建造者无需修改原来的类库 * 缺点:建造者模式的产品具有较多的共同点,组成部分类似。如果产品之间差异较大,则不适合 * 如果产品的内部变化复杂,需要定义更多具体的建造者来配合,导致系统变的庞大 */

    (1)Builer.class.php 建造抽象父类(用于规范子类方法)

    <?php
    namespace Builder;
    
    // 抽象接口 定义装配汽车的流水线
    abstract class Builder
    {
        // 造轮子
        public abstract function buildWheel();
    
        // 造椅子
        public abstract function buildChair();
    
        // 造发动机
        public abstract function buildEngine();
    
        // 组装完成
        public abstract function getCar();
    }

    (2)Director.class.php 指挥类(用于指挥具体建造者工作)

    <?php
    
    namespace Builder;
    
    // 厂长安排工人装配
    class Director
    {
        public function assemble(Builder $builder){
            $builder->buildChair();
            $builder->buildWheel();
            $builder->buildEngine();
        }
    }

    (3)Car.class.php (具体产品类)

    <?php
    
    namespace Builder;
    
    class Car
    {
        private $buildList = [];
    
        public function add($part)
        {
            $this->buildList[] = $part;
        }
    
        public function show(){
            foreach ($this->buildList as $key => $builder){
                echo "组件 " . $builder . " 安装好了".'<br/>';
            }
            print_r("组装完毕");
        }
    }

    (4)ConcreteBuiler.class.php(具体建造者1号,用于建造普通汽车)

    <?php
    
    namespace Builder;
    
    class ConcreteBuilder extends Builder
    {
    
        private $car;
    
        public function __construct()
        {
            $this->car = new Car();
        }
    
        public  function buildChair()
        {
            $this->car->add('装椅子');
        }
    
        public  function buildWheel()
        {
            $this->car->add('装轮子');
        }
    
        public  function buildEngine()
        {
            $this->car->add('装引擎');
        }
    
        public function getCar()
        {
            return $this->car;
        }
    }

    (5)ConcreteBuiler.class.php(具体建造者2号,用于建造好汽车)

    <?php
    
    namespace Builder;
    
    class ConcreteBuilder2 extends Builder
    {
        private $car;
    
        public function __construct()
        {
            $this->car = new Car();
        }
    
        public function buildWheel()
        {
            $this->car->add('造好轮子');
        }
    
        public function buildChair()
        {
            $this->car->add("造好椅子");
        }
    
        public function buildEngine()
        {
            $this->car->add("造好引擎");
        }
    
        public function getCar()
        {
            return $this->car;
        }
    }

    (6)builder.class.php(客户端)

    <?php
    /**
     * 建造者模式
     * 将一个复杂对象的建造与调用者分离。调用者只需要给出指定对象的类型和内容,建造者模式负责按照顺寻创建复杂对象.
     * 以买汽车为例,工厂负责制造汽车,你可以购买你所需要的汽车品牌和型号
     * 指挥者(Director):将复杂对象划分为各个详情对象的建造请求(厂长)
     * 建造请求(Builder):将复杂对象划分为各个详情对象的建造请求(轮子、座椅、发动机)
     * 具体的建造者:建造属于自己的产品部件(轮子制造人,座椅制造人,发动机制造人)
     * 优点:易于解耦,将产品本身与创建的过程分离,可以使用相同的创建过程来创建不同的产品.
     *      易于精确的控制对象,将复杂对象的创建划分在不同的方法中,创建过程更加清晰
     *      易于扩展,增加新的建造者无需修改原来的类库
     * 缺点:建造者模式的产品具有较多的共同点,组成部分类似。如果产品之间差异较大,则不适合
     *      如果产品的内部变化复杂,需要定义更多具体的建造者来配合,导致系统变的庞大
     */
    
    spl_autoload_register(function ($className){
        $className = str_replace('\','/',$className);
        include $className.".class.php";
    });
    
    use BuilderDirector;
    use BuilderConcreteBuilder;
    use BuilderConcreteBuilder2;
    
    // 指挥者
    $director = new Director(); // 具体建造者1 $builder = new ConcreteBuilder(); $director->assemble($builder); $car = $builder->getCar(); //var_dump($car); // 具体建造者2 $builder2 = new ConcreteBuilder2(); $director->assemble($builder2); $car2 = $builder2->getCar(); var_dump($car2);
  • 相关阅读:
    按键精灵-3-按键精灵键盘鼠标命令
    Python-13-pass,del和exec
    STP-9-处理RSTP中的拓扑变化
    Python-12-简单推导
    Python-11-循环
    Python-10-条件和条件语句
    Qt qml listview 列表视图控件(下拉刷新、上拉分页、滚动轴)
    Qt qml pageview 左右滑动分页组件
    Qt qml treeview 树控件
    Qt qml 模拟iphone slide to unlock 的聚光动画文字效果
  • 原文地址:https://www.cnblogs.com/zhouqi666/p/9113442.html
Copyright © 2011-2022 走看看