Статья
Шаблон проектирования "Строитель"

Шаблон проектирования "Строитель"

12 января 2019

Относится к порождающим шаблонам.

Используем класс-строитель, который сам конструирует объект по шагам, используя различные методы (получаем объекты разной конфигурации).

Плюсы:
- уменьшаем количество аргументов конструктора до 1;
- позволяет создать несколько однотипных объектов, незначительно отличающихся друг от друга;
- изолируем логику создания объектов от самого объекта

Минусы: класс привязан к классам строителей.
 



class Pizza
{
    /** @var int */
    private $size;

    /** @var bool */
    private $cheese = false;

    /** @var bool */
    private $pepperoni = false;

    /** @var bool */
    private $tomato = false;

    /**
     * @param PizzaBuilder $builder
     */
    public function __construct(PizzaBuilder $builder)
    {
        $this->size = $builder->getSize();
        $this->cheese = $builder->getCheese();
        $this->pepperoni = $builder->getPepperoni();
        $this->tomato = $builder->getTomato();
    }
}

class PizzaBuilder
{
    /** @var int */
    private $size;

    /** @var bool */
    private $cheese = false;

    /** @var bool */
    private $pepperoni = false;

    /** @var bool */
    private $tomato = false;

    /**
     * @param int $size
     */
    public function __construct(int $size)
    {
        $this->size = $size;
    }

    /**
     * @return PizzaBuilder
     */
    public function addPepperoni(): PizzaBuilder
    {
        $this->pepperoni = true;

        return $this;
    }

    /**
     * @return PizzaBuilder
     */
    public function addCheese(): PizzaBuilder
    {
        $this->cheese = true;

        return $this;
    }

    /**
     * @return PizzaBuilder
     */
    public function addTomato(): PizzaBuilder
    {
        $this->tomato = true;

        return $this;
    }

    /**
     * @return int
     */
    public function getSize(): int
    {
        return $this->size;
    }

    /**
     * @return bool
     */
    public function getPepperoni(): bool
    {
        return $this->pepperoni;
    }

    /**
     * @return bool
     */
    public function getCheese(): bool
    {
        return $this->cheese;
    }

    /**
     * @return bool
     */
    public function getTomato(): bool
    {
        return $this->tomato;
    }

    /**
     * @return Pizza
     */
    public function build(): Pizza
    {
        return new Pizza($this);
    }
}

 

Использование:

$pizza = (new PizzaBuilder(30))->addPepperoni()->addTomato()->build();



Источники:

http://designpatternsphp.readthedocs.io/ru/latest/Creational/Builder/README.html
https://habrahabr.ru/company/mailru/blog/325492/