<?php
/*
  Паттерн "Билдер"
  
  Например, у нас есть какой-то класс 
  с определёнными полями 
  и методом создания
  
  но мы не знаем заранее всех полей,
  а объект создать и пользовать хотим 
*/
class Window
{
  private $visible;
  private $modal;
  
  function __construct( $v, $m ) {
    $this->visible = $v;
    $this->modal = $m;
    
  }
  
  function getIsVisible() {
    return (  $this->visible ? 'On' : 'Off' );
    
  }
  
}


/*
  Создадим вспомогательный класс,
  который будет определять поля основного
*/
class CreateWindow {
  function setVisible( $flag ) { $this->visible = $flag; return $this; }
  function setModal( $flag ) { $this->modal = $flag; return $this; }
  
  function render() {
    return new Window( $this->visible, $this->modal );
    
  }
  
}

$WindowBuilder = new CreateWindow;
$Window = $WindowBuilder->setVisible( true )->setModal( false )->render();

echo $Window->getIsVisible();
