Шаблон Abstract Factory. Выводы

Опубликовал read-php в 20.06.2012 Категория: Генерация объектов ООП

Так что дает нам шаблон Abstract Factory?

  • Во-первых, мы отделили нашу систему от деталей реализации. Мы можем добавлять или удалять любое количество кодирующих форматов в нашем примере, не опасаясь каких-либо проблем.
  • Во-вторых, мы ввели в действие группировку функционально связанных элементов нашей системы. Поэтому при использовании BloggsCommsManager есть гарантия, что мы будем работать только с классами, связанными с BloggsCal.
  • В-третьих, добавление новых продуктов может представлять проблему. Мы должны будем не только создать конкретные реализации новых продуктов, но и внести изменения в абстрактный класс создателя, а также создать каждого из конкретных реализаторов, чтобы его поддержать.

Во многих реализациях шаблона Abstract Factory используется шаблон Factory Method. Возможно, причина в том, что большинство примеров написано на Java или С++. Но в PHP не накладываются обязательные ограничения на тип, возвращаемый из метода, что дает нам больше гибкости, которой мы можем воспользоваться.

Вместо того чтобы создавать отдельные методы для каждого объекта шаблона Factory Method, мы можем создать один метод make () и передать ему в качестве аргумента флаг, определяющий тип возвращаемого объекта.

abstract class CommsManager {

const APPT = 1;

const    TTD = 2;

const CONTACT = 3;

abstract function getHeaderText();

abstract function make( $flag_int );

abstract function getFooterText();

}

class BloggsCommsManager extends CommsManager {

function getHeaderText() {

return «BloggsCal верхний колонтитул\n»;

}

function make( $flag_int ) { switch ( $flag_int ) { case self::APPT:

return new BloggsApptEncoder();

case self::CONTACT:

return new BloggsContactEncoder();

case self::TTD:

return new BloggsTtdEncoder();

}

}

function getFooterText() {

return «BloggsCal нижний колонтитул\n»;

}

}

Как видите, мы сделали интерфейс класса более компактным. Но мы достаточно дорого за это заплатили. Используя шаблон Factory Method, мы определяем четкий интерфейс и заставляем все конкретные объекты фабрики подчиняться ему. Используя единственный Метод make (), мы должны помнить о поддержке всех объектов-продуктов во всех конкретных создателях. Мы также используем параллельные условные операторы, поскольку в каждом конкретном создателе должны быть реализованы одинаковые проверки флага-аргумента. Клиентский класс не может быть уверен, что конкретные создатели генерируют весь набор продуктов, поскольку внутренняя организация метода make () может отличаться в каждом случае.

С другой стороны, мы можем построить более гибких создателей. В базовом классе создателя можно предусмотреть метод make (), который будет гарантировать стандартную реализацию для каждого семейства продуктов. И тогда конкретные дочерние классы могут избирательно модифицировать это поведение. Реализующим создателя классам будет предоставлено право выбора— вызывать стандартный метод make () после собственной реализации или нет.

P.S. Конечно, для начинающего программиста это все довольно сложновато выглядит и начать стоит с более простых примеров программирования на php. Для этого вам пригодится учебник по php в котором вы сможете найти более простые примеры программ на этом языке.

Комментариев нет

Добавить комментарий