Skip to content

Применимость и шаги реализации Abstract Factory

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

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

Также Abstract Factory применима, когда в программе уже используется фабричный метод, но очередные изменения предполагают введение новых типов продуктов.

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

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

  1. Создай таблицу соотношений типов продуктов и вариаций семейств продуктов.
  2. Сведи все вариации продуктов к общим интерфейсам.
  3. Определи интерфейс абстрактной фабрики. Он должен иметь фабричные методы для создания каждого типа продуктов.
  4. Создай классы конкретных фабрик, реализовав интерфейс абстрактной фабрики. Этих классов должно быть столько же, сколько и вариаций семейств продуктов.
  5. Измени код инициализации программы так, чтобы она создавала определённую фабрику и передавала её в клиентский код.
  6. Замени в клиентском коде участки создания продуктов через конструктор вызовами соответствующих методов фабрики

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

+ Гарантирует сочетаемость создаваемых продуктов.

+ Избавляет клиентский код от привязки к конкретным классам продуктов.

+ Выделяет код производства продуктов в одно место, упрощая поддержку кода.

+ Упрощает добавление новых продуктов в программу.

+ Реализует принцип открытости/закрытости.

— Усложняет код программы из-за введения множества дополнительных классов.

— Требует наличия всех типов продуктов в каждой вариации.