Представлен шаблон проектирования Строитель или 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
-------------------------------------------
Итак, было рассказано, как работает порождающий шаблон проектирования Строитель, для чего предназначен, приведен пример использования в приложении. На этом все, до новых встреч!
Перейти к списку шаблонов проектирования.