Звезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активна
 

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

Назначение

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

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

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

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

Структура

 

Участники

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

Результаты

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