Порождающие, структурные и поведенческие паттерны GoF

Классические 23 паттерна проектирования из книги «Банды четырёх» (GoF) делятся на три группы: порождающие, структурные и поведенческие. Это не формальная классификация ради таблицы в учебнике, а способ быстро понять, какую задачу решает шаблон, ещё до того как вы вспомните его устройство. Порождающие отвечают за создание объектов, структурные - за их компоновку, поведенческие - за распределение обязанностей и обмен сообщениями. Ниже разберём принцип деления, пройдёмся по всем трём группам с примерами и разберём, как не перепутать похожие шаблоны. Соберите свой вопрос в форме ниже - и получите разбор конкретного паттерна с UML-схемой и кодом.
Откуда взялось деление на три группы
Деление предложили авторы книги «Design Patterns: Elements of Reusable Object-Oriented Software» (1994) - Эрих Гамма, Ричард Хелм, Ральф Джонсон и Джон Влиссидес, которых называют «Бандой четырёх» (Gang of Four, GoF). Они описали 23 паттерна и расклассифицировали их по двум осям: назначение (purpose) и уровень (scope).
По назначению паттерны и разбиваются на три знакомые группы:
- Порождающие (creational) - отвечают за процесс создания объектов, делают систему независимой от того, как именно объекты создаются и компонуются.
- Структурные (structural) - описывают, как из классов и объектов складываются более крупные структуры.
- Поведенческие (behavioral) - определяют алгоритмы и распределение обязанностей между объектами, способы их взаимодействия.
Вторая ось - scope - делит паттерны на работающие с классами (связи фиксируются на этапе компиляции через наследование) и с объектами (связи устанавливаются в рантайме через композицию). Большинство из 23 - объектные; именно поэтому паттерны так часто опираются на принцип «предпочитай композицию наследованию».

Порождающие паттерны: кто и как создаёт объекты
Порождающих паттернов пять. Все они инкапсулируют знание о том, какие конкретные классы используются, и прячут детали создания объекта за общим интерфейсом. Клиентский код просит «дай мне объект», не зная, какой именно класс будет инстанцирован.
- Фабричный метод (Factory Method) - определяет интерфейс для создания объекта, но решение о конкретном классе оставляет подклассам.
- Абстрактная фабрика (Abstract Factory) - создаёт семейства связанных объектов (например, виджеты под разные ОС) без привязки к конкретным классам.
- Строитель (Builder) - пошагово собирает сложный объект, разделяя процесс конструирования и представление.
- Прототип (Prototype) - создаёт новые объекты копированием существующего экземпляра-образца.
- Одиночка (Singleton) - гарантирует, что у класса будет ровно один экземпляр, и даёт к нему глобальную точку доступа.
Признак, что нужен порождающий паттерн: в коде разрастаются конструкторы с десятком аргументов, оператор new раскидан по бизнес-логике, или класс жёстко завязан на конкретные типы зависимостей. Если вы видите длинную цепочку условий «если тип A - создать ClassA, если B - создать ClassB», это намёк на Фабричный метод или Абстрактную фабрику. Похожий разбор есть в статье про абдукцию Пирса - там тоже речь о том, как выбрать наилучшую гипотезу из множества вариантов.
Структурные паттерны: как собрать объекты в систему
Структурных паттернов семь. Они отвечают на вопрос «как соединить объекты, чтобы получить гибкую и расширяемую структуру», не переписывая существующие классы.
- Адаптер (Adapter) - приводит несовместимый интерфейс класса к тому, который ожидает клиент.
- Мост (Bridge) - разделяет абстракцию и реализацию, чтобы их можно было менять независимо.
- Компоновщик (Composite) - позволяет работать с деревом объектов (часть-целое) единообразно, не различая лист и ветку.
- Декоратор (Decorator) - динамически добавляет объекту новые обязанности, оборачивая его.
- Фасад (Facade) - даёт единый упрощённый интерфейс к сложной подсистеме.
- Приспособленец (Flyweight) - экономит память, разделяя общее состояние между множеством мелких объектов.
- Заместитель (Proxy) - подменяет объект суррогатом, который контролирует доступ к нему (ленивая загрузка, кэш, права).
Общая идея группы - композиция вместо переписывания. Адаптер, Декоратор, Заместитель и Мост снаружи выглядят похоже (все оборачивают другой объект), но решают разные задачи: Адаптер меняет интерфейс, Декоратор добавляет поведение, Заместитель контролирует доступ, Мост разводит две независимые иерархии.

Поведенческие паттерны: распределение обязанностей
Поведенческих паттернов больше всего - одиннадцать. Они описывают, как объекты обмениваются сообщениями и кто за что отвечает в алгоритме.
- Цепочка обязанностей (Chain of Responsibility) - передаёт запрос по цепочке обработчиков, пока один из них не справится.
- Команда (Command) - превращает запрос в объект, что даёт отмену, очередь и логирование операций.
- Итератор (Iterator) - даёт способ последовательного обхода коллекции, не раскрывая её устройство.
- Посредник (Mediator) - централизует взаимодействие объектов, убирая прямые связи «каждый с каждым».
- Хранитель (Memento) - сохраняет и восстанавливает внутреннее состояние объекта, не нарушая инкапсуляцию.
- Наблюдатель (Observer) - оповещает множество подписчиков об изменении состояния субъекта.
- Состояние (State) - меняет поведение объекта при смене внутреннего состояния, будто меняется его класс.
- Стратегия (Strategy) - выносит семейство взаимозаменяемых алгоритмов в отдельные классы.
- Шаблонный метод (Template Method) - задаёт скелет алгоритма, оставляя отдельные шаги подклассам.
- Посетитель (Visitor) - выносит операцию из иерархии классов наружу, позволяя добавлять операции без правки классов.
- Интерпретатор (Interpreter) - задаёт грамматику языка и интерпретатор предложений этого языка.
Здесь чаще всего путают Стратегию и Состояние: устройство почти одинаковое (объект делегирует поведение вложенному объекту), но Стратегия выбирает алгоритм извне и он обычно не меняется по ходу, а Состояние само переключает себя в зависимости от внутренних условий.
Как не перепутать группы: быстрый тест
Чтобы отнести шаблон к группе, задайте один вопрос - «что в первую очередь делает паттерн?»:
- Если он про появление объекта (где, когда, какого класса) - порождающий.
- Если про сборку нескольких объектов в структуру или смену интерфейса - структурный.
- Если про взаимодействие и распределение работы между объектами в рантайме - поведенческий.
Формально количество выглядит так:
Запоминать список целиком необязательно: на собеседовании и в курсовой ценится понимание принципа группировки и умение по описанию задачи назвать подходящий паттерн, а не зубрёжка всех двадцати трёх.
Частые ошибки
- Путать классификацию по назначению и по уровню. Деление на порождающие/структурные/поведенческие - это ось purpose; class/object scope - отдельная ось. В вопросе «к какой группе относится Адаптер» имеют в виду первую.
- Считать Singleton «хорошим» паттерном по умолчанию. Это порождающий шаблон, но он вводит глобальное состояние и усложняет тестирование - на собеседовании уместно упомянуть его минусы.
- Смешивать Адаптер и Фасад. Оба «упрощают доступ», но Адаптер приводит один интерфейс к другому, а Фасад прячет целую подсистему за одним интерфейсом.
- Называть MVC паттерном GoF. MVC - архитектурный паттерн, его нет среди 23 шаблонов «Банды четырёх».
- Путать Стратегию и Шаблонный метод. Оба про варьирование алгоритма, но Стратегия делает это через композицию (объект-стратегия), а Шаблонный метод - через наследование (переопределение шагов).
FAQ
Сколько всего паттернов в каждой группе? Пять порождающих, семь структурных и одиннадцать поведенческих - всего 23 паттерна GoF. Это каноническое число из книги 1994 года; позже сообщество добавило другие шаблоны, но «классических» именно 23.
Чем порождающие паттерны отличаются от структурных? Порождающие отвечают за создание объектов и прячут детали инстанцирования (какой класс, как собран). Структурные работают с уже существующими объектами - соединяют их в более крупные структуры или приводят интерфейсы к совместимому виду.
Какой паттерн учить первым? Начните с самых употребимых: из порождающих - Фабричный метод и Строитель, из структурных - Адаптер и Декоратор, из поведенческих - Стратегия и Наблюдатель. Они встречаются в реальном коде чаще остальных и хорошо иллюстрируют идею каждой группы.
Коротко
Двадцать три паттерна GoF делятся по назначению на три группы: порождающие (5) управляют созданием объектов, структурные (7) собирают объекты в гибкие структуры, поведенческие (11) распределяют обязанности и организуют взаимодействие. Чтобы определить группу паттерна, спросите, что он делает в первую очередь - создаёт, компонует или координирует. Понимание принципа деления важнее заучивания всего списка.
Читайте также

Паттерн Factory Method: пример и разбор фабричного метода
Паттерн Factory Method на простом примере: зачем нужна фабрика объектов, как устроены Creator и Product, чем отличается от Абстрактной фабрики и где применять в коде.

Абстрактный класс и интерфейс: в чём отличие
Абстрактный класс и интерфейс: чем отличаются в ООП, когда наследовать поведение, а когда задавать контракт, как выбрать на примерах Java, C# и Python.

Наследование классов в ООП: пример и разбор
Наследование классов в ООП на примере: базовый класс, наследник, переопределение методов и вызов super. Разбираем виды наследования, синтаксис в разных языках и частые ошибки.