PHP-建造者模式

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

 

 

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

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

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

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

 

 

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

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

 

file

代码

<?php
// 生产车的部件 - 轮子
class Wheel{}

// 生产车的部件 - 引擎
class Engine{}

// 生产车的部件 - 门
class Door{}

// 组装车辆的抽象类
abstract class Vehicle
{
    /*
    * @var object[]
    */
    private $data = [];
    
    /*
    * @param string $key
    * @param object $value
    */
    public function setPart($key, $value)
    {
        $this->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);*/

打印出来的数据:

<?php
Truck Object
(
    [data:Vehicle:private] => 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() 让车构造了起来。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值