НЕ МОЛЧИ!!!    Сделай что-нибудь,
чтобы остановить войну России в Украине.
...бойтесь людей равнодушных - именно с их молчаливого согласия происходят все самые ужасные преступления на свете.   ("Репортаж с петлёй на шее")

Шаблон проектирования Factory Method (Фабричный метод)

Рассматривается шаблон проектирования Factory Method (Фабричный метод), его применение, приводится пример реализации на PHP.

Содержание

  • Применение
  • Структура шаблона
  • Реализация
  • Итоги

Применение

Как известно, основа ООП это объекты. В любом более или менее серьезном приложении их используется великое множество. Если создавать объекты оператором new, то этот оператор будет разбросан по всему приложению и привязан к конкретному классу. И если надо будет, например, заменить одни объекты другими, придется, как минимум, изменять уже созданный код по всему приложению, что является плохой практикой, т.к. требуются поиск и правка кода по всему приложению. Чтобы избежать этого, используют шаблон проектирования Factory Method.
Подытожим, шаблон Фабричный метод используют для создания более чистого, менее связанного кода. Давайте разбираться, как это происходит.

Структура шаблона

В шаблоне создаётся семейство продуктов приложения, параллельно создаётся семейство классов, создающих экземпляры этих продуктов. Родителем семейств выступает, как правило, абстрактный класс, но можно использовать и интерфейс. А уже в наследниках создается конкретная реализация объектов. Таким образом, имеем следующую структуру классов.

  • Product — абстрактный класс, определяет общие свойства и методы семейства каких-то продуктов.
  • ProductA — класс конкретного продукта А, описывающий конкретный продукт.
  • ProductB — класс конкретного продукта B, описывающий конкретный продукт.
  • Factory — абстрактный класс, определяющий семейство классов-создателей, создающих объекты продуктов. В нем объявляется основной метод factoryMethod(). Метод может быть абстрактным или содержать реализацию объекта по умолчанию.
  • FactoryA — класс создания продуктов типа А. Наследник класса Factory.
  • FactoryB — класс создания продуктов типа B. Наследник класса Factory.

Реализация

Создаем семейство классов продуктов. Исходной точкой семейства является абстрактный класс Product.

//здесь определяются общие свойства и методы семейства продуктов
abstract class Product
{
   // набор методов продукта   
}


class  ProductA extends Product
{

}

class  ProductB extends Product
{

}

Теперь нам надо создать производителей экземпляров продуктов. Здесь также исходным будет абстрактный класс Factory, в котором объявлен основной метод создания продуктов.

abstract class Factory
{
  abstract public factoryMethod();
}

class FactoryA
{
  public factoryMethod()	
  { 
    return new ProductA();
  }
}

class FactoryB
{
  public factoryMethod()
  {
    return new ProductB();
  }
}

Вот и все. В примере приведен код без детализации. Это сделано для того, чтобы выделить логику шаблона. Желающие большей конкретики могут получить ее по ссылке «Пример использования шаблона Фабричный метод«

Итоги

Итак, вы познакомились с очередным порождающим шаблоном проектирования Factory Method. Его достоинства.

  • Код приложения по созданию объекта не привязывается к конкретным классам.
  • Удобно использовать, когда клиентский код не знает, какой продукт он будет использовать.
  • Простое расширение семества, новые виды продуктов создаются без изменения существующего кода.

К недостаткам шаблона следует отнести усложнение кода из-за необъходимости для каждого нового продукта создавать его производителя.

На этом всё.

Успехов в разработке!

Вернуться к списку шаблонов проектирования.