Паттерн Cтроитель PHP

основой для примера послужил этот код


/* абстрактный строитель*/
abstract class AbstractPageBuilder {
    abstract function getPage();
}



/* Абстрактный распорядитель*/
abstract class AbstractPageDirector {
    abstract function __construct(AbstractPageBuilder $builder_in);
    abstract function buildPage();
    abstract function getPage();
}



/* Пример конткретного продукта 
(обобщённый интерфейс дял продуктов обычно не описывают - 
почему см. в описании)*/
class HTMLPage {
    private $page = NULL;
    private $page_title = NULL;
    private $page_heading = NULL;
    private $page_text = NULL;
    function __construct() {
    }
    function showPage() {
      return $this->page;
    }
    function setTitle($title_in) {
      $this->page_title = $title_in;
    }
    function setHeading($heading_in) {
      $this->page_heading = $heading_in;
    }
    function setText($text_in) {
      $this->page_text .= $text_in;
    }
    function formatPage() {
       $this->page  = '<html>';
       $this->page .= '<head><title>'.$this->page_title.'</title></head>';
       $this->page .= '<body>';
       $this->page .= '<h1>'.$this->page_heading.'</h1>';
       $this->page .= $this->page_text;
       $this->page .= '</body>';
       $this->page .= '</html>';
    }
}

/*
Строитель - им руководит распорядитель
*/
class HTMLPageBuilder extends AbstractPageBuilder {
    private $page = NULL;
    function __construct() {
      $this->page = new HTMLPage();
    }
    function setTitle($title_in) {
      $this->page->setTitle($title_in);
    }
    function setHeading($heading_in) {
      $this->page->setHeading($heading_in);
    }
    function setText($text_in) {
      $this->page->setText($text_in);
    }
    function formatPage() {
      $this->page->formatPage();
    }
    function getPage() {
      return $this->page;
    }
}

/*распорядитель - его то и будет использовать клиент*/
class HTMLPageDirector extends AbstractPageDirector {
    private $builder = NULL;
    public function __construct(AbstractPageBuilder $builder_in) {
         $this->builder = $builder_in;
    }

/* 
в этом методе как раз демонстрирует процесс отправки 
запросов строителю - на посторойку фрагментов продукта
*/
    public function buildPage() {
      $this->builder->setTitle('Testing the HTMLPage');
      $this->builder->setHeading('Testing the HTMLPage');
      $this->builder->setText('Testing, testing, testing!');
      $this->builder->setText('Testing, testing, testing, or!');
      $this->builder->setText('Testing, testing, testing, more!');
      $this->builder->formatPage();
    }
    public function getPage() {
      return $this->builder->getPage();
    }
}


/*а вот дальше - демонстрация работы - это как раз и есть КОД КЛИЕНТА*/
  writeln('BEGIN TESTING BUILDER PATTERN');
  writeln('');

// создаём строитель
  $pageBuilder = new HTMLPageBuilder();
// параметризуем распорядителя строителем
  $pageDirector = new HTMLPageDirector($pageBuilder);
  $pageDirector->buildPage();
 // $page = $pageDirector->GetPage(); // не у распорядителя!
$page = $pageBuilder->GetPage();  // а у строителя забирается продукт клиентом
  writeln($page->showPage());
  writeln('');
 
  writeln('END TESTING BUILDER PATTERN');

  function writeln($line_in) {
    echo $line_in."<br/>";
  }