Skip to content

Latest commit

 

History

History

abstractFactory

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 

Порождающие шаблоны / Абстрактная фабрика

Абстрактная фабрика (Abstract factory)

Содержание

Описание паттерна

Абстрактная ситуация. Стулья и стили

Вы занимаетесь дизайном помещений. В каждом проекте обязательно должны быть жизненно необходимые предметы: стол, стул и шкаф. При этом для стиля Модерн и для стиля Классицизм - это должны быть разные стол, стул и шкаф.

Как вам не запутаться в подборе предметов для разных стилей?

Здесь можно выделить две проблемы:

  • однообразие - стул в стиле Модерн не должен соседствовать с Классическим шкафом.
  • комплектация - в каждом наборе обязательно должны быть все три предмета.

Лучше, если подбор таких комбинаций будет абстрагирован в отдельную фабрику. ФабрикаМодерн будет производить только предметы мебели в стиле Модерн. ФабрикаКлассицизм - только предметы мебели в стиле Классицизм. Так мы решаем проблему однообразия наборов.

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


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

Набор объектов - одинаковый (стол, стул, шкаф), а типы - разные (модерн или классика).

Абстрактная фабрика позволяет координировать работу таких отдельных (конкретных) фабрик, обеспечивает для них одинаковый интерфейс, контролирует набор типов объектов, которые нужно создать.

Реализация паттерна

Схема паттерна Абстрактная фабрика

  • Иерархия фабрик
    • Интерфейс AbstractFactory объявляет методы для создания каждой из нужных групп объектов (CreateProductA, CreateProductB).
    • Классы конкретных фабрик (ConcreteFactory1, ConcreteFactory2) реализуют методы создания каждой из нужных групп объектов.
  • Иерархия продуктов
    • Для каждой группы объектов (ProductA, ProductB) создаются свои деревья наследования. Это позволяет сохранить одинаковый интерфейс для разных объектов одной группы.
  • Каждая конкретная фабрика САМА определяет, как и какой именно объект ей создавать.

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

Примеры

Использование

  • В программе много продуктов разных видов, которые необходимо объединять в группы.
  • Эволюция Фабричного метода при добавлении новых типов продуктов.

Преимущества

  • Обеспечивает сочетаемость продуктов в группе/наборе.
  • Убирает лишние связанности (клиентский код не зависит от классов конкретных продуктов).
  • Сводит весь код производства групп продуктов в одно место.
  • Упрощает замену семейств продуктов.

Недостатки

  • Много классов, большие иерархии.
  • Для каждого набора необходимо наличие всех продуктов (даже если они "пустые").
  • Сложно добавить новый продукт (придется добавлять во все наборы).

Похожие паттерны

Абстрактная фабрика часто является эволюцией паттерна Фабричный метод при увеличении количества продуктов в программе.

Взаимодействие с другими паттернами

Использование паттерна в структуре другого паттерна (один паттерн является частью другого)

Способы реализации паттерна (вариации механизмов работы паттерна)

Источники