Skip to content

Factory Method

Pandas edited this page Jun 16, 2017 · 3 revisions

Фабричный метод — паттерн, порождающий классы.

Назначение:

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

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

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

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

Структура:

Imgur

Участники:

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

Отношения

Создатель «полагается» на свои подклассы в определении фабричного ме тода, который будет возвращать экземпляр подходящего конкретного продукта.

Реализация

  • две основных разновидности паттерна. Во первых, это случай, когда класс Creator является абстрактным и не содержит реализации объявленного в нем фабричного метода. Вторая возможность: Creator – конкретный класс, в котором по умолчанию есть реализация фабричного метода. Редко, но встречается и абстрактный класс, имеющий реализацию по умолчанию; В первом случае для определения реализации необходимы подклассы, по скольку никакого разумного умолчания не существует. При этом обходится проблема, связанная с необходимостью инстанцировать заранее неизвест ные классы. Во втором случае конкретный класс Creator использует фаб ричный метод, главным образом ради повышения гибкости. Выполняется правило: «Создавай объекты в отдельной операции, чтобы подклассы мог ли подменить способ их создания». Соблюдение этого правила гарантирует, что авторы подклассов смогут при необходимости изменить класс объектов, инстанцируемых их родителем;
  • параметризованные фабричные методы.Это еще один вариант паттерна, который позволяет фабричному методу создавать разные виды продуктов. Фабричному методу передается параметр, который идентифицирует вид создаваемого объекта. Все объекты, получающиеся с помощью фабричного метода, разделяют общий интерфейс Product.

Достоинства:

  • Позволяет сделать код создания объектов более универсальным, не привязываясь к конкретным классам (ConcreteProduct), а оперируя лишь общим интерфейсом (Product);
  • Позволяет установить связь между параллельными иерархиями классов.

Недостатки:

  • Необходимость создавать наследника Creator для каждого нового типа продукта (ConcreteProduct). Впрочем, современные языки программирования поддерживают конструкции, что позволяют реализовать фабричный метод без иерархии классов Creator.
Clone this wiki locally