09、PHP 设计模式-建造者模式

建造者模式

建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。建造者模式属于对象创建型模式。根据中文翻译的不同,建造者模式又可以称为生成器模式。

模式结构

建造者模式包含如下角色:

  • Builder:抽象建造者
  • ConcreteBuilder:具体建造者
  • Director:指挥者
  • Product:产品角色

结构图

 

PHP代码实现

<?php

// 产品类
class Car {
    public $wheels = 4;
    public $engine;
    public $transmission;

    public function setEngine($engine) {
        $this->engine = $engine;
    }

    public function setTransmission($transmission) {
        $this->transmission = $transmission;
    }

    // 产品的其他设置方法...
}

// 抽象建造者
abstract class CarBuilder {
    protected $car;

    public function createNewCar() {
        $this->car = new Car();
    }

    public function getCar() {
        return $this->car;
    }

    abstract public function buildEngine();
    abstract public function buildTransmission();
    // 其他构建方法...
}

// 具体建造者
class SportsCarBuilder extends CarBuilder {
    public function buildEngine() {
        $this->car->setEngine('Sports engine');
    }

    public function buildTransmission() {
        $this->car->setTransmission('Manual transmission');
    }
    // 其他构建方法的实现...
}

class SUVCarBuilder extends CarBuilder {
    public function buildEngine() {
        $this->car->setEngine('SUV engine');
    }

    public function buildTransmission() {
        $this->car->setTransmission('Automatic transmission');
    }
    // 其他构建方法的实现...
}

// 导演类
class Director {
    public function build(CarBuilder $builder) {
        $builder->createNewCar();
        $builder->buildEngine();
        $builder->buildTransmission();
        // 指挥建造者构建其他部分...
        return $builder->getCar();
    }
}

// 客户端使用示例
$director = new Director();

// 构建一辆运动车
$sportsCarBuilder = new SportsCarBuilder();
$sportsCar = $director->build($sportsCarBuilder);
echo "Car engine type: " . $sportsCar->engine . "\n";
echo "Car transmission type: " . $sportsCar->transmission . "\n";

// 构建一辆SUV车
$suvCarBuilder = new SUVCarBuilder();
$suvCar = $director->build($suvCarBuilder);
echo "Car engine type: " . $suvCar->engine . "\n";
echo "Car transmission type: " . $suvCar->transmission . "\n";