设计模式参考链接https://learnku.com/docs/php-design-patterns/2018/DependencyInjection/1501
Builder 是一个构建复杂对象部分的接口。
有时,如果构建者对它构建的内容有更好的了解,那么这个接口可以是一个带有默认方法的抽象类(也称为适配器)。
如果对象有一个复杂的继承树,那么为构建者也有一个复杂的继承树是合乎逻辑的。
注意:构建者通常有一个流畅的界面,例如,参见 PHPUnit 的模拟构建者。
建造者模式又名生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。
建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。例如,一辆汽车由轮子,发动机以及其他零件组成,对于普通人而言,我们使用的只是一辆完整的车,这时,我们需要加入一个构造者,让他帮我们把这些组件按序组装成为一辆完整的车。
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() 让车构造了起来。