设计模式之建造者模式(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 Builder\Director;
use Builder\ConcreteBuilder;
use Builder\ConcreteBuilder2;

// 指挥者
$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);

 

posted @ 2018-05-30 21:14  周起  阅读(419)  评论(0编辑  收藏  举报