📜  建造者设计模式(1)

📅  最后修改于: 2023-12-03 15:25:32.917000             🧑  作者: Mango

建造者设计模式

建造者设计模式(Builder Design Pattern)是一种创建型设计模式,它允许你将复杂对象的构建过程从其表示中分离出来,以便同样的构建过程可以创建不同的表示。

模式结构

建造者设计模式包含以下角色:

  • Director(指导者):负责控制构建过程,即组装各个部件。
  • Builder(建造者):为创建一个产品的不同部件提供接口。
  • ConcreteBuilder(具体建造者):实现 Builder 接口,构建和装配各个部件。
  • Product(产品):表示被构建的复杂对象。

以下是模式结构图:

Builder Design Pattern

实现步骤
  1. 创建一个 Product 类表示被构建的复杂对象,它包含多个部件。
  2. 创建一个 Builder 接口,声明用于建造不同部件的方法。
  3. 创建具体建造者 ConcreteBuilder 类,实现 Builder 接口并构建和装配各个部件。
  4. 创建一个 Director 类,负责控制构建过程,即指导 ConcreteBuilder 如何构建和装配不同的部件。
  5. 最后,在客户端中实例化 Director 和具体建造者 ConcreteBuilder 类,然后调用 Director 实例的构建方法,即可得到构建完成的产品对象。

以下是示例代码,以 PHP 为例:

// Product
class Car
{
    private $parts = [];

    public function addPart($part)
    {
        $this->parts[] = $part;
    }

    public function listParts()
    {
        return implode(', ', $this->parts);
    }
}

// Builder
interface Builder
{
    public function addDoors();
    public function addEngine();
    public function addWheels();
    public function getVehicle(): Car;
}

// ConcreteBuilder
class CarBuilder implements Builder
{
    private $car;

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

    public function addDoors()
    {
        $this->car->addPart('4 doors');
    }

    public function addEngine()
    {
        $this->car->addPart('V6 engine');
    }

    public function addWheels()
    {
        $this->car->addPart('alloy wheels');
    }

    public function getVehicle(): Car
    {
        return $this->car;
    }
}

// Director
class CarDealer
{
    private $builder;

    public function __construct(Builder $builder)
    {
        $this->builder = $builder;
    }

    public function constructCar()
    {
        $this->builder->addDoors();
        $this->builder->addEngine();
        $this->builder->addWheels();
    }
}

// Client
$carBuilder = new CarBuilder();
$carDealer = new CarDealer($carBuilder);
$carDealer->constructCar();
$car = $carBuilder->getVehicle();
echo $car->listParts(); // Output: 4 doors, V6 engine, alloy wheels
适用场景

建造者设计模式适用于以下场景:

  • 当需要创建一个复杂对象时,并且该对象包含多个部件或步骤,且这些部件或步骤之间存在复杂的依赖关系时。
  • 当需要创建的对象可能有多个表示方式(即展示层和业务逻辑层),或者需要使用不同的部件创建对象时。
  • 当需要避免构造函数在参数数量或类型方面的缺陷,或者要通过一步一步地构建对象来增加灵活性时。
优点和缺点
优点
  • 将构建过程和表示分离,提高了代码的灵活性和可维护性。
  • 可以通过控制 DirectorConcreteBuilder 的交互顺序来改变对象的内部表示。
  • 建造者对象独立,易于扩展和修改。
缺点
  • 建造者模式的实现需要增加很多新增类,使得整个代码结构更加庞大。
  • 建造者模式不能保证代码结构的单一职责原则,而且由于需要创建多个部件和组装它们,导致创建对象的性能较差。