EssayAI
Блог
Блог
Математика и алгоритмы

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

19 июня 2026Время чтения: 7 минут
#паттерны проектирования#GoF#ООП#порождающие паттерны#поведенческие паттерны
Порождающие, структурные и поведенческие паттерны 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 - объектные; именно поэтому паттерны так часто опираются на принцип «предпочитай композицию наследованию».

Три группы паттернов GoF: порождающие создают объекты, структурные их компонуют, поведенческие распределяют обязанности
Три группы паттернов GoF: порождающие создают объекты, структурные их компонуют, поведенческие распределяют обязанности

Порождающие паттерны: кто и как создаёт объекты

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

  • Фабричный метод (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) - задаёт грамматику языка и интерпретатор предложений этого языка.

Здесь чаще всего путают Стратегию и Состояние: устройство почти одинаковое (объект делегирует поведение вложенному объекту), но Стратегия выбирает алгоритм извне и он обычно не меняется по ходу, а Состояние само переключает себя в зависимости от внутренних условий.

Как не перепутать группы: быстрый тест

Чтобы отнести шаблон к группе, задайте один вопрос - «что в первую очередь делает паттерн?»:

  • Если он про появление объекта (где, когда, какого класса) - порождающий.
  • Если про сборку нескольких объектов в структуру или смену интерфейса - структурный.
  • Если про взаимодействие и распределение работы между объектами в рантайме - поведенческий.

Формально количество выглядит так:

5порожд+7структ+11повед=235_{\text{порожд}} + 7_{\text{структ}} + 11_{\text{повед}} = 23

Запоминать список целиком необязательно: на собеседовании и в курсовой ценится понимание принципа группировки и умение по описанию задачи назвать подходящий паттерн, а не зубрёжка всех двадцати трёх.

Частые ошибки

  • Путать классификацию по назначению и по уровню. Деление на порождающие/структурные/поведенческие - это ось purpose; class/object scope - отдельная ось. В вопросе «к какой группе относится Адаптер» имеют в виду первую.
  • Считать Singleton «хорошим» паттерном по умолчанию. Это порождающий шаблон, но он вводит глобальное состояние и усложняет тестирование - на собеседовании уместно упомянуть его минусы.
  • Смешивать Адаптер и Фасад. Оба «упрощают доступ», но Адаптер приводит один интерфейс к другому, а Фасад прячет целую подсистему за одним интерфейсом.
  • Называть MVC паттерном GoF. MVC - архитектурный паттерн, его нет среди 23 шаблонов «Банды четырёх».
  • Путать Стратегию и Шаблонный метод. Оба про варьирование алгоритма, но Стратегия делает это через композицию (объект-стратегия), а Шаблонный метод - через наследование (переопределение шагов).

FAQ

Сколько всего паттернов в каждой группе? Пять порождающих, семь структурных и одиннадцать поведенческих - всего 23 паттерна GoF. Это каноническое число из книги 1994 года; позже сообщество добавило другие шаблоны, но «классических» именно 23.

Чем порождающие паттерны отличаются от структурных? Порождающие отвечают за создание объектов и прячут детали инстанцирования (какой класс, как собран). Структурные работают с уже существующими объектами - соединяют их в более крупные структуры или приводят интерфейсы к совместимому виду.

Какой паттерн учить первым? Начните с самых употребимых: из порождающих - Фабричный метод и Строитель, из структурных - Адаптер и Декоратор, из поведенческих - Стратегия и Наблюдатель. Они встречаются в реальном коде чаще остальных и хорошо иллюстрируют идею каждой группы.

Коротко

Двадцать три паттерна GoF делятся по назначению на три группы: порождающие (5) управляют созданием объектов, структурные (7) собирают объекты в гибкие структуры, поведенческие (11) распределяют обязанности и организуют взаимодействие. Чтобы определить группу паттерна, спросите, что он делает в первую очередь - создаёт, компонует или координирует. Понимание принципа деления важнее заучивания всего списка.

Доверьте текст нейросети EssayAI

Открыть EssayAI

Бесплатно, на русском языке и без VPN

Читайте также