🏭 Порождающие шаблоны проектирования: структура и применение на простых примерах
В третьей, заключительной части статьи об основных шаблонах проектирования, мы рассмотрим порождающие шаблоны: абстрактную фабрику, строителя, фабричный метод, прототип и одиночку.
Напоминаем: поведенческие шаблоны разобраны в первой части статьи, а структурные – во второй.
Порождающий шаблон «Абстрактная фабрика»
Назначение
Предоставляет интерфейс, который делегирует вызовы создания одному или нескольким конкретным классам для поставки определенных объектов.
Когда использовать
- Если создание объектов должно быть независимым от использующей их системы.
- Системы должны быть способны использовать несколько семейств объектов.
- Семейства объектов должны использоваться вместе.
- Библиотеки должны быть опубликованы без раскрытия деталей реализации.
- Конкретные классы должны быть отделены от клиентов.
Структура
Абстрактная фабрика (Abstract Factory) объявляет методы создания различных абстрактных продуктов (Abstract Product). Конкретные фабрики (Concrete Factory) создают вариации продуктов.
Клиент (Client) может работать с любыми вариациями продуктов через абстрактные интерфейсы.
Пример
Редакторы электронной почты позволяют создавать сообщения в различных форматах, включая простой и форматированный текст, а также HTML. В зависимости от используемого формата необходимо создавать различные объекты. Если сообщение является простым текстом, то может быть создан объект body, представляющий обычный текст, и объект attachment, который просто шифрует вложение в Base64. Если сообщение пишется в HTML формате, то объект body будет представлять текст с HTML разметкой, а объект attachment будет предусматривать не только стандартное вложение, но и отображение в тексте сообщения. Используя абстрактную фабрику для создания объектов, можно гарантировать, что соответствующие наборы объектов будут созданы в зависимости от формата отправляемого сообщения.
Порождающий шаблон «Строитель»
Назначение
Позволяет динамически создавать сложные объекты на основе легко взаимозаменяемых алгоритмов.
Когда использовать
- Если алгоритмы создания объектов должны быть отделены от системы.
- Требуется наличие нескольких представлений алгоритмов создания.
- Необходимо добавление новой функциональности создания без изменения основного кода.
- Нужен контроль над процессом создания во время выполнения.
Структура
Интерфейс строителя (Builder) объявляет шаги конструирования продуктов, общие для всех конкретных строителей. Директор(Director) определяет порядок вызова строительных шагов для производства определенного вида продуктов. Конкретные строители (Concrete Builder) реализуют строительные шаги, производя различные продукты.
Пример
Приложение для передачи файлов может использовать множество различных протоколов для отправки файлов, и фактический объект передачи, который будет создан, будет напрямую зависеть от выбранного протокола. Используя этот шаблон, можно определить, какой тип «Строителя» использовать для создания нужного объекта. Если в качестве параметра выбран протокол FTP, то при создании объекта будет использован «Строитель» для FTP.
Порождающий шаблон «Фабричный метод»
Назначение
Открывает метод для создания объектов, позволяя подклассам контролировать процесс создания.
Когда использовать
- Если класс не должен знать, какие подклассы он будет создавать.
- Нужно дать подклассам возможность определять, какие объекты будут создаваться.
- Родительским классам нужно отложить создание объектов для своих подклассов.
Структура
Создатель (Creator) объявляет фабричный метод, который должен возвращать новые продукты. Продукт (Product) определяет общий интерфейс объектов, которые создают подклассы Creator. Конкретные создатели (Concrete Creator) по-разному реализуют фабричный метод, производя различные конкретные продукты (Concrete Products).
Пример
Во многих приложениях с целью обеспечения безопасности используется установленная структура для пользователей и групп. Когда приложению необходимо создать пользователя, оно обычно делегирует создание пользователя нескольким конкретным создателям. Родительский объект пользователя будет обрабатывать большинство операций для каждого пользователя, но подклассы будут определять фабричный метод, который обрабатывает различия в создании каждого типа пользователей. Система может иметь объекты AdminUser и StandardUser, каждый из которых расширяет объект User. Объект AdminUser может выполнять некоторые дополнительные задачи для обеспечения доступа, а StandardUser может делать то же самое для ограничения доступа.
Порождающий шаблон «Прототип»
Назначение
Клонирование существующих объектов.
Когда использовать
- Если композиция, создание и представление объектов должны быть отделены от системы.
- Создаваемые классы задаются во время выполнения.
- В объекте существует ограниченное число комбинаций состояний.
- Требуются объекты или структуры объектов, которые идентичны или очень похожи на другие существующие объекты или структуры объектов.
- Первоначальное создание каждого объекта является ресурсоемкой операцией.
Структура
Клиент (Client) обращается к объекту через общий интерфейс прототипов для создания копии.
Интерфейс прототипов (Prototype) описывает операции клонирования. Конкретный прототип (Concrete Prototype) реализует клонирование себя вместе со связанными объектами.
Пример
Алгоритмы обработки данных часто требуют поиска множества различных значений, что делает процесс ресурсозатратным. Когда требуется несколько экземпляров движка, например, для импорта данных в многопоточном режиме, затраты ресурсов на инициализацию многочисленных движков становятся слишком высокими. Используя шаблон «Прототип», можно обеспечить инициализацию только одного экземпляра механизма, а затем просто клонировать его, чтобы создать дубликат уже инициализированного объекта. Дополнительным преимуществом этого является то, что клоны могут быть оптимизированы и включать только те данные, которые необходимы в конкретной ситуации.
Порождающий шаблон «Одиночка»
Назначение
Гарантирует, что в системе находится только один экземпляр класса.
Когда использовать
- Если требуется ровно один экземпляр класса.
- Необходим контролируемый доступ к одному объекту.
Структура
Одиночка (Singleton)определяет статический метод instance(), который возвращает единственный экземпляр своего класса. Конструктор одиночки скрыт от клиентов. Вызов метода instance() должен быть единственным способом получить объект этого класса.
Пример
Большинство языков программирования создают объект окружения, который позволяет языку взаимодействовать с операционной системой. Поскольку приложение физически выполняется только на одной операционной системе, существует необходимость в единственном экземпляре этого системного объекта. Шаблон «Одиночка» реализуется во время работы с языком, чтобы гарантировать создание только одной копии системного объекта и обеспечить доступ к нему только соответствующим процессам.
Материалы по теме
Шаблоны проектирования в JavaScript простыми словами
Шаблоны проектирования по-человечески: 6 порождающих паттернов, которые упростят жизнь
Шаблоны проектирования в Python: для стильного кода