Порождающие шаблоны / Абстрактная фабрика
- Описание паттерна
- Реализация паттерна
- Примеры
- Использование
- Преимущества
- Недостатки
- Похожие паттерны
- Взаимодействие с другими паттернами
- Источники
Вы занимаетесь дизайном помещений. В каждом проекте обязательно должны быть жизненно необходимые предметы: стол, стул и шкаф. При этом для стиля Модерн и для стиля Классицизм - это должны быть разные стол, стул и шкаф.
Как вам не запутаться в подборе предметов для разных стилей?
Здесь можно выделить две проблемы:
- однообразие - стул в стиле Модерн не должен соседствовать с Классическим шкафом.
- комплектация - в каждом наборе обязательно должны быть все три предмета.
Лучше, если подбор таких комбинаций будет абстрагирован в отдельную фабрику. ФабрикаМодерн будет производить только предметы мебели в стиле Модерн. ФабрикаКлассицизм - только предметы мебели в стиле Классицизм. Так мы решаем проблему однообразия наборов.
Теперь нужно проследить, чтобы каждая фабрика умела производить все необходимые предметы. Просто объединим эти фабрики в одну иерархию и определим для них одинаковый интерфейс.
Паттерн Абстрактная фабрика
позволяет создавать целые семейства взаимосвязанных объектов. Он определяет общий интерфейс для целой группы разных отдельных фабрик, каждая из которых предоставляет нужный набор объектов.
Набор объектов - одинаковый (стол, стул, шкаф), а типы - разные (модерн или классика).
Абстрактная фабрика позволяет координировать работу таких отдельных (конкретных) фабрик, обеспечивает для них одинаковый интерфейс, контролирует набор типов объектов, которые нужно создать.
- Иерархия фабрик
- Интерфейс
AbstractFactory
объявляет методы для создания каждой из нужных групп объектов (CreateProductA
,CreateProductB
). - Классы конкретных фабрик (
ConcreteFactory1
,ConcreteFactory2
) реализуют методы создания каждой из нужных групп объектов.
- Интерфейс
- Иерархия продуктов
- Для каждой группы объектов (
ProductA
,ProductB
) создаются свои деревья наследования. Это позволяет сохранить одинаковый интерфейс для разных объектов одной группы.
- Для каждой группы объектов (
- Каждая
конкретная фабрика
САМА определяет, как и какой именно объект ей создавать.
Объект Конкретной фабрики
обычно создается при запуске программы в зависимости от некоторой конфигурации или окружения.
- В программе много продуктов разных видов, которые необходимо объединять в группы.
- Эволюция
Фабричного метода
при добавлении новых типов продуктов.
- Обеспечивает сочетаемость продуктов в группе/наборе.
- Убирает лишние связанности (клиентский код не зависит от классов конкретных продуктов).
- Сводит весь код производства групп продуктов в одно место.
- Упрощает замену семейств продуктов.
- Много классов, большие иерархии.
- Для каждого набора необходимо наличие всех продуктов (даже если они "пустые").
- Сложно добавить новый продукт (придется добавлять во все наборы).
- Строитель (Builder). Фабрика с более тонкой настройкой.
- Фабричный метод (Factory method). Производство одного продукта.
- Фасад (Facade). Простой интерфейс для множества объектов/операций.
Абстрактная фабрика часто является эволюцией паттерна Фабричный метод
при увеличении количества продуктов в программе.
Использование паттерна в структуре другого паттерна (один паттерн является частью другого)
- Фабричный метод (Factory method), Прототип (Prototype). Используются в
Конкретных фабриках
для производстваКонкретных продуктов
.
Способы реализации паттерна (вариации механизмов работы паттерна)
- Мост (Bridge).
- Одиночка (Singleton).
Абстрактная фабрика
может бытьСинглтоном
.