Классификация: порождающие, структурные, поведенческие

Как устроен каталог из 23 паттернов GoF и почему их делят на три группы — порождающие, структурные и поведенческие.

Классификация GoF отвечает на вопрос «о чём паттерн»: про создание объектов, про их структуру или про их поведение и взаимодействие.

Три семейства

GoF разложили 23 паттерна по трём полкам. Это не строгая теория, а удобный навигатор: зная, какую проблему вы решаете, вы сразу сужаете поиск до одной группы.

ГруппаО чёмПримеры
Порождающие (creational)как создаются объекты, отделяя клиента от деталей конструированияSingleton, Factory Method, Abstract Factory, Builder, Prototype
Структурные (structural)как объекты и классы собираются в более крупные структурыAdapter, Decorator, Facade, Composite, Proxy, Bridge, Flyweight
Поведенческие (behavioral)как объекты распределяют обязанности и общаются между собойStrategy, Observer, Command, Iterator, State, Template Method, Chain of Responsibility

Как отличить группу по симптому

  • Если вопрос «кто и как создаёт объект» — это порождающий паттерн.
  • Если вопрос «как соединить несовместимое или собрать целое из частей» — структурный.
  • Если вопрос «как объекты договариваются и кто за что отвечает в рантайме» — поведенческий.

Маленькая программа-навигатор: по «симптому» подсказывает группу.

def classify(symptom):
    table = {
        "создание объекта": "порождающий",
        "склейка структур": "структурный",
        "взаимодействие объектов": "поведенческий",
    }
    return table.get(symptom, "неизвестно")


for s in ["создание объекта", "склейка структур", "взаимодействие объектов"]:
    print(f"{s} -> {classify(s)}")

Вывод:

создание объекта -> порождающий
склейка структур -> структурный
взаимодействие объектов -> поведенческий

Класс или объект

GoF вводят и второе деление — по уровню. Паттерны уровня класса работают через наследование и фиксируются на этапе компиляции (например, Template Method). Паттерны уровня объекта работают через композицию и связи между экземплярами, их можно менять в рантайме (большинство паттернов). На практике композиция гибче, поэтому современный совет — «предпочитайте композицию наследованию».

Зачем вообще классификация

Может показаться, что деление на три группы — формальность. На деле это рабочий инструмент диагностики. Столкнувшись с задачей, вы первым делом спрашиваете себя: «это про то, как объект рождается, как он устроен или как он себя ведёт?» Ответ отсекает две трети каталога и оставляет 5–7 кандидатов вместо 23. Дальше внутри группы выбор делается по более тонким признакам, которые мы разберём в соответствующих разделах.

Важно и то, что один паттерн нередко решает задачу, похожую на другую группу. Например, и Strategy (поведенческий), и Factory Method (порождающий) убирают разрастающийся if: первый — по алгоритму, второй — по создаваемому типу. Классификация подсказывает направление, но финальный выбор всегда за смыслом задачи, а не за ярлыком.

Итог

  • Порождающие — про создание, структурные — про композицию, поведенческие — про взаимодействие.
  • Классификация — это навигатор: определите тип проблемы, и круг кандидатов сузится.
  • Деление «класс/объект» подсказывает: композиция обычно гибче наследования.
Проверьте себя
1. К какой группе относится Builder?
AСтруктурный
BПоведенческий
CПорождающий
DНи к какой
2. Вопрос «как соединить два несовместимых интерфейса» указывает на группу…
AПорождающих
BСтруктурных
CПоведенческих
DКонкурентных
3. Чем поведенческие паттерны отличаются от остальных?
AОни про создание объектов
BОни про распределение обязанностей и общение объектов
CОни про упаковку классов в библиотеки
DОни работают только через наследование
Поддержать проект