26.08 2010

Prototype

Перед прочтением ознакомьтесь с введением в паттерны проектирования на PHP, в котором описаны принятые соглашения и понятия. Данная статья дополняется с некоторой периодичностью, так что если вы ее читали ранее, не факт что данные не изменились.

Prototype (Прототип) относиться к классу порождающих паттернов. Он используется для задания вида создаваемых объектов на основе объекта прототипа, от которого происходит передача внутреннего состояния. Он сродни фабричному методу, позволяет избавиться от жесткой привязки к классам, и, как следствие, вязкости кода.

Существует множество реализаций данного паттерна, я приведу три основных:

// Method 1.

class ClassA
{
    public function __construct(ClassA $Prototype = null)
    {
        if (null !== $Prototype)
        {
            //do something
        }
    }
}

$Prototype = new ClassA();
$NewObject = new ClassA($Prototype);

// Method 2

class ClassB
{
    /**
     * This function return new object
     *
     * @return ClassB
     */

    public function getClone()
    {
       $object = new ClassB();
       //do something with object
       return $object;
    }
}

$Prototype = new ClassB();
$NewObject = $Prototype -> getClone();

// Method 3

class ClassC
{
    public function __clone()
    {
        //do something
    }
}

$Prototype = new ClassC();
$NewObject = clone $Prototype;

Скачать пример можно тут

В первом методе в конструктор поступает объект прототип, из которого мы получаем всю необходимую информацию. Недостаток такого метода в том, что мы все равно имеем жесткую привязку к классу. В таком случае паттерн прототип обычно используют совместно с фабричным методом.

Во втором методе объект прототип порождает новый объект и сам заполняет его. Может быть использован совместно с первым методом, тогда происходит делегирование прав на передачу состоянию конструктору нового объекта.

Третий метод схож со вторым, за исключением того, что порождение нового объекта происходит встроенными средствами php. Этот метод наиболее предпочтителен, на нем и остановимся

Суть паттерна

UML Prototype

Применимость

  • инстанцируемые классы объявляются во время динамической загрузки (например из базы данных или XML)
  • если экземпляры класса могут находиться в одном из небольшого числа начальных состояний, а создавать новые объекты приходится на их основе часто, то это позволяет уменьшить количество написанного кода
  • В определенной архитектуре введение прототипов позволяет уменьшить количество абстрактных фабрик, создаваемых параллельно иерархии классов
comments powered by Disqus