<?php
/*
  Фабрика
  Как интерфейс создания объектов
  (одного или нескольких типов, в зависимости от полиморфного инпута)
  
  Может быть реализорана как класс или отдельная функция
  
  Пример ниже -- фабрика фигур разных типов,
  реализующих единый интерфейс с методом draw();
  
  Следующая ступень, если нужно -- фабрика фабрик;
  
*/

interface Shape { function draw(); }
 
class SquareShape implements Shape {
  function draw(){ echo __METHOD__; }
}
class RectangleShape implements Shape {
  function draw(){ echo __METHOD__; }
}
class CircleShape implements Shape {
  function draw(){ echo __METHOD__; }
}


class ShapeFactory
{
  function getShape( $type ) {
    $type = strtoupper( $type );
    if(!$type) return NULL;
    
    switch( $type ) {
      case 'R': return new SquareShape; break;
      case 'S': return new RectangleShape; break;
      case 'C': return new CircleShape; break;
      default: throw new Exception('Unknown type');
    }
    
  }
  
}

$ShapeFactory = new ShapeFactory;

$r = $ShapeFactory->getShape('R');
$s = $ShapeFactory->getShape('S');
$c = $ShapeFactory->getShape('C');
$r->draw();
$s->draw();
$c->draw();
 
  
   
   