PHP 构造者模式

<?php
/**
 * 建造者模式
 * 场景:构建一个复杂过程的类时候
 * 抽象一个类的构建过程,
 * 在让一个具体的构建类,实现过程.
 * 让具体的类去构建一个复杂的具体类
 */

/**
 * Class Computed
 * 构建复杂类
 */
class Computed {
    protected $cpu;
    protected $gpu;
    protected $Ssd;
    public function setCpu ($str)
    {
        return $this->cpu = $str;
    }
    public function setGpu ($str)
    {
        return $this->gpu = $str;
    }
    public function setSsd ($str)
    {
        return $this->Ssd = $str;
    }
    public function show () {
       echo $this->cpu.$this->gpu.$this->Ssd.PHP_EOL;
    }
}

/**
 * Class Build
 * 抽象构造复杂类接口
 */
abstract class Build {
    protected $computed;
    abstract public function buildCpu();
    abstract public function buildGpu();
    abstract public function buildSsd();
    // ......
}

/**
 * Class ComputedBuild
 * 构建复杂类具体实现 集成build 接口
 */
class ComputedBuild extends Build {
    public function __construct()
    {
        $this->computed = new Computed() ;
    }
    public function buildCpu()
    {
        $this->computed->setCpu('i7 4900K');
        // TODO: Implement Cpu() method.
    }

    public function buildGpu()
    {
        $this->computed->setGpu('GTX 780ti');
        // TODO: Implement Gpu() method.
    }

    public function buildSsd()
    {
        $this->computed->setSsd('SDD-500G');
        // TODO: Implement Sdd() method.
    }
    public function selfObj () {
        return $this->computed;
    }

}

/**
 * Class Director
 * 操作复杂构造实现类
 */
class Director {
    public $dBuild;
    // 传入一个 继承了 build 的类
    public function setObject (Build $build)
    {
        $this->dBuild = $build;
    }
    // 操作构造类创建复杂类实例并返回
    public function startBuild ()
    {
        $this->dBuild->buildCpu();
        $this->dBuild->buildGpu();
        $this->dBuild->buildSsd();
        return $this->dBuild->selfObj();
    }
}

$computed = new ComputedBuild(); // 具体构造实例类
$director = new Director(); // 操作具体构造实例类

$director->setObject($computed); // 传入 具体构造实例类
$newComputed = $director->startBuild(); // 返回复杂类
$newComputed->show(); // i7 4900K GTX 780tiSDD-500G 输出

猜你喜欢

转载自my.oschina.net/u/3529405/blog/1823551