PHP-建造者模式

设计模式参考链接https://learnku.com/docs/php-design-patterns/2018/DependencyInjection/1501

 

 

Builder 是一个构建复杂对象部分的接口。

有时,如果构建者对它构建的内容有更好的了解,那么这个接口可以是一个带有默认方法的抽象类(也称为适配器)。

如果对象有一个复杂的继承树,那么为构建者也有一个复杂的继承树是合乎逻辑的。

注意:构建者通常有一个流畅的界面,例如,参见 PHPUnit 的模拟构建者。

 

 

建造者模式又名生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。

建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。例如,一辆汽车由轮子,发动机以及其他零件组成,对于普通人而言,我们使用的只是一辆完整的车,这时,我们需要加入一个构造者,让他帮我们把这些组件按序组装成为一辆完整的车。

 

PHP-建造者模式_第1张图片

代码

data[$key] = $value;
    }// setPart() end
}// Vehicle{} end

// Truck 继承 Vehicle 后获得了组装车辆的方法
class Truck extends Vehicle{}

// Car 继承 Vehicle 后获得了组装车辆的方法
class Car extends Vehicle{}

// 设定建造的接口类
interface BuilderInterface
{
    public function createVehicle();
    
    public function addWheel();
    
    public function addEngine();
    
    public function addDoors();
    
    public function getVehicle(): Vehicle;
}// BuilderInterface{} end

class TruckBuilder implements BuilderInterface
{
    /*
    * @var class Truck{}
    */
    private $truck;
    
    // 源码中并无,是为了兼顾代码运行而添加的
    public function __construct()
    {
        $this->createVehicle();
    }// __construct() end
    
    public function addDoors()
    {
        $this->truck->setPart('rightDoor', new Door());
        $this->truck->setPart('leftDoor', new Door());
    }// addDoors() end
    
    public function addEngine()
    {
        $this->truck->setPart('truckEngine', new Engine());
    }// addEngine() end
    
    public function addWheel()
    {
        $this->truck->setPart('wheel1', new Wheel());
        $this->truck->setPart('wheel2', new Wheel());
        $this->truck->setPart('wheel3', new Wheel());
        $this->truck->setPart('wheel4', new Wheel());
        $this->truck->setPart('wheel5', new Wheel());
        $this->truck->setPart('wheel6', new Wheel());
    }// addWheel() end
    
    public function createVehicle()
    {
        $this->truck = new Truck();
    }// createVehicle() end
    
    public function getVehicle(): Vehicle
    {
        return $this->truck;
    }// getVehicle() end
}// TruckBuilder{} end

class CarBuilder implements BuilderInterface
{
    /*
    * @var class Car{}
    */
    private $car;
    
    // 源码中并无,是为了兼顾代码运行而添加的
    public function __construct()
    {
        $this->createVehicle();
    }// __construct() end
    
    public function addDoors()
    {
        $this->car->setPart('rightDoor', new Door());
        $this->car->setPart('leftDoor', new Door());
        $this->car->setPart('trunkLid', new Door());
    }// addDoors() end
    
    public function addEngine(){
        $this->car->setPart('engine', new Engine());
    }// addEngine() end
    
    public function addWheel(){
        $this->car->setPart('wheelLF', new Wheel());
        $this->car->setPart('wheelLF', new Wheel());
        $this->car->setPart('wheelLR', new Wheel());
        $this->car->setPart('wheelRR', new Wheel());
    }// addWheel() end
    
    public function createVehicle()
    {
        $this->car = new Car();
    }// createVehicle() end
    
    public function getVehicle(): Vehicle
    {
        return $this->car;
    }// getVehicle() end
}// CarBuilder{} end

/*
* Director 是构建器模式的一部分。
* 它知道建设者的界面在构建器的帮助下构建一个复杂的对象
* 您还可以注入许多构建器而不是一个来构建更复杂的对象。
*/
class Director
{
    public function build(BuilderInterface $builder): Vehicle
    {
        $builder->createVehicle();
        $builder->addDoors();
        $builder->addEngine();
        $builder->addWheel();
        
        return $builder->getVehicle();
    }// build() end
}// Director{} end

$truckBuilder = new TruckBuilder();
$newVehicle = (new Director())->build($truckBuilder);
print_r($newVehicle);

/*$carBuilder = new CarBuilder();
$newVehicle = (new Director())->build($carkBuilder);
print_r($newVehicle);*/

打印出来的数据:

 Array
        (
            [rightDoor] => Door Object
                (
                )

            [leftDoor] => Door Object
                (
                )

            [truckEngine] => Engine Object
                (
                )

            [wheel1] => Wheel Object
                (
                )

            [wheel2] => Wheel Object
                (
                )

            [wheel3] => Wheel Object
                (
                )

            [wheel4] => Wheel Object
                (
                )

            [wheel5] => Wheel Object
                (
                )

            [wheel6] => Wheel Object
                (
                )

        )

)

代码解析

BuilderInterface{} 接口设定了建造汽车的每个步骤,TruckBuilder{} 和 CarBuilder{} 实现了它。

Engine{} 、Wheel{} 、Door{} 、定义了建造汽车部件的具体内容。

Vehicle{} 定义了组装汽车部件的方法。Truck{} 和 Car{} 则继承了 Vehicke{} 获取组装部件的方法。

Director{} 的 build() 让车构造了起来。

你可能感兴趣的:(PHP-建造者模式)