Паттерн Builder на php
дата публикации: 2016-04-21

Паттерн Builder или строитель, являясь порождающим паттерном, на первый взгляд очень похож на абстрактную фабрику, но если присмотреться, то можно найти различия. К примеру абстрактная фабрика, при должной фантазии, может быть представлена как большой механический робот, который собирает уже готовые, разработанные кем-то детали в единый механизм, тогда как строитель просто напросто знает последовательность действий по созданию объекта и далее его создает, создает не из кирпичиков, а выполняет вполне конкретные процедуры. Теперь постараюсь привести более жизненный пример, который далее реализовать в коде.

Представьте себе самого обычного строителя, которому поставили задачу - построить несколько типов заборов. Строитель знает последовательность операций, которая позволяет ему построить разные типы заборов, к примеру красный забор из деревянных досок с деревянными балками или зеленый забор из железных пластин с железным каркасом. Если бы строитель был абстрактной фабрикой, то он бы просто собрал как из конструктора оба типа заборов, при этом прежде чем собрать, он бы потребовал уже готовые блоки. Вот в этом основное отличие строителя от фабрики. Фабрика собирает объект из готовых блоков, а строитель принимает задание, создает объект и высылает его. Теперь приведу код строителя.

//файл classes.php
//класс забора
class fence {
  private $construct = "";
  private $plank = "";
  private $color = "";
  public function setConstruct($construct) {
    $this->construct = $construct;
    print "$construct construction was created
"; } public function setPlank($plank) { $this->plank = $plank; print "$plank plank was created
"; } public function setColor($color) { $this->color = $color; print "fence was painted in $color
"; } } //абстрактный класс разновидностей заборов abstract class fenceAbstract { protected $fence; public function getFence() { return $this->fence; } public function createFence() { $this->fence = new fence(); } abstract public function setConstruct(); abstract public function setPlank(); abstract public function setColor(); } //красный деревянный забор с деревянными балками class redFence extends fenceAbstract { public function setConstruct() { $this->fence->setConstruct("wooden"); } public function setPlank() { $this->fence->setPlank("wooden"); } public function setColor() { $this->fence->setColor("red"); } } //зеленый металлический забор с металлической конструкцией class greenFence extends fenceAbstract { public function setConstruct() { $this->fence->setConstruct("iron"); } public function setPlank() { $this->fence->setPlank("iron"); } public function setColor() { $this->fence->setColor("green"); } } //класс строителя class builder { private $fence; public function setFence(fenceAbstract $p) { $this->fence = $p; } public function getFence() { return $this->fence->getFence(); } public function constructFence() { $this->fence->createFence(); $this->fence->setConstruct(); $this->fence->setPlank(); $this->fence->setColor(); } } //файл index.php include "classes.php"; //создаем строителя $builder = new builder(); //строим красный забор print "New red fence:"; $builder->setFence(new redFence()); $builder->constructFence(); $redFence = $builder->getFence(); //строим зеленый забор print "New green fence:"; $builder->setFence(new greenFence()); $builder->constructFence(); $greenFence = $builder->getFence();

На экран будет выведено следующее:

New red fence:
wooden construction was created
wooden plank was created
fence was painted in red
New green fence:
iron construction was created
iron plank was created
fence was painted in green

В результате исполнения кода наш строитель построил два забора: один красный, другой зеленый.