二. PHP的23种设计模式之一 - 建造者模式
2023-03-27 本文已影响0人
JensenXie
建造者模式(Builder Pattern)是一种创建型设计模式,可以理解是将多个简单的对象一点点组合成一个复杂对象或是将一个复杂的对象的创建过程分离出来,使这个创建过程可以独立出来,让创建复杂对象更加的灵活。
在建造者模式中,通常会有一个抽象的建造过程的建造者类和具体的建造者类,抽象建造者类定义了具体的建造接口,建造者类继承这个接口并实现它。另外还有指挥者类(Director),用于控制建造者类,协调对象的控制过程。
建造者模式的优点
- 隐藏对象的创建过程,让客户端不需要关心具体的创建过程。
- 对象的构造过程可以复用,可以在不同的复杂对象中重复复用。
- 可以灵活的扩展对象的构造过程,增加新的创建步骤或者更改创建步骤的顺序。
下面我写了一个简单的建造者模式demo,我们需要创建一个复杂对象(电脑),其中有一个抽象的电脑创建类(AbstractComputerBuilder),和两个具体的电脑建造者类实现抽象的电脑创建类(LaptopBuilder和DesktopBuilder),在指挥者类(Director)中,我们控制具体的建造者类,调用创建过程实现复杂的电脑类。
<?
//抽象的电脑建造者类
abstract class AbstractComputerBuilder
{
protected $computer;
public function getComputer() {
return $this->computer;
}
public function createComputer() {
$this->computer = new Computer();
}
abstract public function addCpu();
abstract public function addRam();
abstract public function addVideoCard();
}
//台式电脑电脑建造者类
class DesktopBuilder extends AbstractComputerBuilder
{
public function addCpu()
{
$this->computer->setCpu("I7");
}
public function addRam()
{
$this->computer->setRam("32G");
}
public function addVideoCard()
{
$this->computer->setVideoCard("4080ti");
}
}
//笔记本电脑电脑建造者类
class LaptopBuilder extends AbstractComputerBuilder
{
public function addCpu()
{
$this->computer->setCpu("I5");
}
public function addRam()
{
$this->computer->setRam("16G");
}
public function addVideoCard()
{
$this->computer->setVideoCard("3080");
}
}
//电脑类
class Computer
{
private $cpu;
private $ram;
private $videoCard;
public function setCpu($cpu)
{
$this->cpu = $cpu;
}
public function setRam($ram)
{
$this->ram = $ram;
}
public function setVideoCard($videoCard)
{
$this->videoCard = $videoCard;
}
public function getComputerParams()
{
return "CPU: {$this->cpu}, RAM: {$this->ram}, Hard Drive: {$this->videoCard}";
}
}
class Director {
private $builder;
public function setBuilder($builder){
$this->builder = $builder;
}
public function getComputer(){
return $this->builder->getComputer();
}
public function buildComputer() {
$this->builder->createComputer();
$this->builder->addCpu();
$this->builder->addRam();
$this->builder->addVideoCard();
}
}
$desktopBuilder = new DesktopBuilder();
$laptopBuilder = new LaptopBuilder();
$director = new Director();
//构造台式电脑
$director->setBuilder($desktopBuilder);
$director->buildComputer();
$desktopComputer = $director->getComputer();
echo $desktopComputer->getComputerParams().'<br>';
//构造笔记本电脑
$director->setBuilder($laptopBuilder);
$director->buildComputer();
$laptopComputer = $director->getComputer();
echo $laptopComputer->getComputerParams();