НЕ МОЛЧИ!!!    Сделай что-нибудь, чтобы остановить войну России в Украине.
...бойтесь людей равнодушных - именно с их молчаливого согласия происходят все самые ужасные преступления на свете.   ("Репортаж с петлёй на шее")

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

Представлен шаблон проектирования Строитель  или Builder, приведены описание шаблона и пример реализации на PHP.

Итак, сегодня займемся шаблоном проектирования Строитель. Он, как и другие порождающие шаблоны, призван отделить от приложения код по созданию объекта. В отличие от других шаблон Строитель задуман для создания разновидностей одного и того же продукта. Например, мы создали какой-то отчет и теперь, в зависимости от предпочтений пользователя или особенностей клиентского устройства, Строитель поможет адаптировать его под клиента.
Как это достигается? Пусть в приложении необходим Продукт в различном исполнении. Создаются классы Строителей, каждый из которых умеет создавать свой вариант Продукта. Для унификации строители наследуются от абстрактного класса. Какой продукт использовать, выбирает Менеджер. Вот как это выглядит в коде.
Наш продукт, востребованный приложением.

class Product
{
    private $list;

    public function add($elem)
    {
        $this->list[] = $elem;
    }

    public function getProduct()
    {
        foreach ($this->list as $el) {
            echo $el . '<br>';
        }
        echo '<hr>';
    }
}

Далее объект класса Manager будет получать на входе Строителя и с его помощью создавать нужный тип продукта.

class Manager
{
    public function setConstruct($builder)
    {
        $builder->buildPartA();
        $builder->buildPartB();
    }
}

Теперь надо создать Строителей. Реализация достаточно стандартная, создается абстрактный строитель с набором нужных методов, который потом реализуется в наследниках. Каждый наследник создает свой вариант Продукта.

abstract class BuilderAbstract
{
    public function buildPartA()
    {
    }

    public function buildPartB()
    {
    }

    abstract public function getResult();
}

class Builder1 extends BuilderAbstract
{
    private $product;

    public function __construct()
    {
        $this->product = new Product();
    }
    
    public function buildPartA()
    {
        $this->product->add('Part A1 of Product');
    }
    
    public function buildPartB()
    {
        $this->product->add('Part B1 of Product');
    }
    
    public function getResult()
    {
        return $this->product;
    }
}

class Builder2 extends BuilderAbstract
{
    private $product;

    public function __construct()
    {
        $this->product = new Product();
    }

    public function buildPartA()
    {
        $this->product->add('Part A2 of Product');
    }

    public function buildPartB()
    {
        $this->product->add('Part B2 of Product');
    }

    public function getResult()
    {
        return $this->product;
    }
}

Осталось продемонстрировать, как это работает. Для этого помещаем вышеприведенный код в модуль builder.php. Далее в демонстрационный скрипт index.php помещаем такой код.

<div style="width:350px;">
<h3>Пример работы паттерна Builder</h3>

<?php

include 'builder.php';

$manager = new Manager();  // создаем менеджера

Создаем строителей.

$builder1 = new Builder1();
$builder2 = new Builder2();

// создаем вариант 1 продукта
$manager->setConstruct($builder1); //создает части А и В продукта1
$product1 = $builder1->getResult();  //получаем продукт1
$product1->getProduct();                   //выводим продукт1

// создаем вариант 2 продукта
$manager->setConstruct($builder2);
$product2 = $builder2->getResult();
$product2->getProduct();

?>

</div>

При запросе index.php на клиенте получим:

Пример работы паттерна Builder
Part A1 of Product
Part B1 of Product 
-------------------------------------------
Part A2 of Product
Part B2 of Product 
-------------------------------------------

Итак, было рассказано, как работает порождающий шаблон проектирования Строитель, для чего предназначен, приведен пример использования в приложении. На этом все, до новых встреч!

Перейти к списку шаблонов проектирования.