Skip to content

Latest commit

 

History

History
83 lines (53 loc) · 7.31 KB

Abstract_Factory.md

File metadata and controls

83 lines (53 loc) · 7.31 KB

Абстрактная фабрика

UML

Позволяет создавать семейства связанных объектов, не привязываясь к конкретным классам создаваемых объектов.(Через общий интерфейс фабрик)

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

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

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

    • В хорошей программе, каждый класс отвечает только за одну вещь. Если класс имеет слишком много фабричных методов, они способны затуманить его основную функцию. Поэтому имеет смысл вынести всю логику создания продуктов в отдельную иерархию классов, применив абстрактную фабрику.

Шаги реализации

  1. Создайте таблицу соотношений типов продуктов к вариациям семейств продуктов.

  2. Сведите все вариации продуктов к общим интерфейсам.

  3. Определите интерфейс абстрактной фабрики. Он должен иметь фабричные методы для создания каждого из типов продуктов.

  4. Создайте классы конкретных фабрик, реализовав интерфейс абстрактной фабрики. Этих классов должно быть столько же, сколько и вариаций семейств продуктов.

  5. Измените код инициализации программы так, чтобы она создавала определённую фабрику и передавала её в клиентский код.

  6. Замените в клиентском коде участки создания продуктов через конструктор вызовами соответствующих методов фабрики.

Преимущества и недостатки

+ -
Гарантирует сочетаемость создаваемых продуктов. Усложняет код программы за счёт множества дополнительных классов.
Избавляет клиентский код от привязки к конкретным классам продуктов. Требует наличия всех типов продуктов в каждой вариации.
Выделяет код производства продуктов в одно место, упрощая поддержку кода.
Упрощает добавление новых продуктов в программу.
Реализует принцип Open/closed.

Отношения с другими паттернами

  • Многие архитектуры начинаются с применения Фабричного метода (более простого и расширяемого через подклассы) и эволюционируют в сторону Абстрактной фабрики, Прототипа или Строителя (более гибких, но и более сложных).

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

  • Классы Абстрактной фабрики чаще всего реализуются с помощью Фабричного метода, хотя они могут быть построены и на основе Прототипа.

  • Абстрактная фабрика может быть использована вместо Фасада для того, чтобы скрыть платформо-зависимые классы.

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

  • Абстрактная фабрика, Строитель и Прототип могут быть реализованы при помощи Одиночки.