НЕ МОЛЧИ!!!    Сделай что-нибудь, чтобы остановить войну России в Украине.
Иначе завтра ТЫ будешь следующим!

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

Описание шаблона проектирования Фабричный метод с примером.

Все согласятся, что ООП построено на использовании объектов. Если создавать их по мере необходимости оператором new, то этот оператор будет разбросан по всему приложению и привязан к конкретному классу. И если надо будет, например, заменить одни объекты другими, придется изменять уже созданный код по всему приложению, что является плохой практикой. Применение шаблона Фабричный метод позволяет создавать более чистый код.
Как это происходит? Создаем семейство продуктов, параллельно создаем семейство производителей этих продуктов, их можно написать с использованием интерфейса или абстрактного класса. В примере ниже используется абстрактный класс Factory, в котором объявляется метод FactoryMethod() по созданию объекта. Он может быть абстрактным или содержать реализацию объекта по умолчанию. После этого в наследниках этого класса создается или переопределяется реализация метода FactoryMethod(), которая возвращает экземпляр конкретного класса. Фактически, создание объекта происходит через фабричный метод-обертку.

Пример шаблона Фабричный метод

Создаем семейство классов продуктов.

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


class  ProductA extends Product
{

}

class  ProductB extends Product
{

}

Теперь нам надо создать производителей продуктов.

abstract class Factory
{
  abstract public factoryMethod();
}

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

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

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

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

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