Определяет интерфейс для создания объектов, при этом выбранный класс инстанцируется подклассами.

Назначение

Определяет интерфейс для создания объекта, но оставляет подклассам решение о том, какой класс инстанцировать. Фабричный метод позволяет классу делегировать инстанцирование подклассам.

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

Используйте паттерн фабричный метод, когда:

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

Структура

 

Участники

  • Product - продукт - определяет интерфейс объектов, создаваемых фабричным методом;
  • ConcreteProduct - конкретный продукт - реализует интерфейс Product;
  • Creator - создатель:
    • объявляет фабричный метод, возвращающий объект типа Product. Creator может также определять реализацию по умолчанию фабричного метода, который возвращает объект ConcreteProduct;
    • может вызывать фабричный метод для создания объекта Product;
  • ConcreteCreator - конкретный создатель - замещает фабричный метод, возвращающий объект ConcreteProduct.

Результаты

  • Фабричные методы избавляют проектировщика от необходимости встраивать в код зависящие от приложения классы. Код имеет дело только с интерфейсом класса Product, поэтому он может работать с любыми определенными пользователями классами конкретных продуктов.
  • Потенциальный недостаток фабричного метода состоит в том, что клиентам, возможно, придется создавать подкласс класса Creator для создания лишь одного объекта ConcreteProduct. Порождение подклассов оправдано, если клиенту так или иначе приходится создавать подклассы Creator, в противном случае клиенту придется иметь дело с дополнительным уровнем подклассов.
  • Предоставляет подклассам операции-зацепки. Создание объектов внутри класса с помощью фабричного метода всегда оказывается более гибким решением, чем непосредственное создание. Фабричный метод создает в подклассах операции-зацепки для предоставления расширенной версии объекта.
  •  соединяет параллельные иерархии. Параллельные иерархии возникают в случае, когда класс делегирует часть своих обязанностей другому классу, не являющемуся производным от него.