四、建造者模式
4.1什么是建造者模式
建造者模式也称为生成器模式,Separate the construction of a complex object from its representation sothat the same construction
process can create different representations.(将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。)。
简答来说,就是把不同流程的类的生成单独抽到同一个管理类中。该类只负责调用具体的生产方法,不做其他的。
4.2怎么实现建造者模式
产品类:具体要生产的类
产品生产公共类:定义通用的方法
具体生产类:实现不同的产品类的属性和行为
构建者类:储存不同的具体生产类的调用方法
<?php
/**
* 基础汽车类
*/
abstract class BaseCar
{
public $sequence = [];
abstract protected function start();
abstract protected function alarm();
abstract protected function stop();
public function run()
{
foreach($this->sequence as $item) {
if ($item == 'start') {
$this->start();
} else if ($item == 'alarm') {
$this->alarm();
} else if ($item == 'stop') {
$this->stop();
}
}
}
}
/**
* 具体汽车类
*/
class BMCar extends BaseCar
{
public $sequence = [];
protected function start() {echo 'start BM',PHP_EOL;}
protected function alarm() {echo 'alarm BM',PHP_EOL;}
protected function stop() {echo 'stop BM',PHP_EOL;}
}
/**
* 生产者基础类
*/
abstract class BaseBuilder
{
abstract public function setSequence($sequence);
abstract public function getModel();
}
/**
* 具体生产者类
*/
class BMBuilder extends BaseBuilder
{
private $bmModel = null;
public function __construct()
{
$this->bmModel = new BMCar();
}
public function setSequence($sequence)
{
$this->bmModel->sequence = $sequence;
}
public function getModel()
{
return $this->bmModel;
}
}
/**
* 生成器类
*/
class CarGenerator
{
// 储存方法顺序
private $sequence = [];
// 具体要生产哪个类
private $bmBuilder;
public function __construct()
{
$this->bmBuilder = new BMBuilder();
}
public function getBMCar()
{
$this->sequence = [];
$this->sequence[] = 'start';
$this->sequence[] = 'stop';
$this->bmBuilder->setSequence($sequence);
return $this->bmBuilder->getModel();
}
}
4.3建造者模式优点是什么
-
封装性:客户端不用关心产品内部组成的细节
-
建造者队列,容易拓展
-
便于控制细节风险:具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响
4.4建造者模式和工厂模式的区别
-
建造者模式主要的功能是基本方法的调用顺序安排,通俗一点就是零件的装配,顺序不同产生不同的结果
-
工厂模式重点是创建,创建零件是它的主要职责,组装顺序则不是它所关心的
4.5使用场景
-
相同的方法,不同的执行顺序,产生不同的事件结果是,可以采用建造个模式
-
多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时
-
产品类分成复杂,或者产品类中的调用顺序不同产生了不同的效能