Классификация: порождающие, структурные, поведенческие
Как устроен каталог из 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: первый — по алгоритму, второй — по создаваемому типу. Классификация подсказывает направление, но финальный выбор всегда за смыслом задачи, а не за ярлыком.
Итог
- Порождающие — про создание, структурные — про композицию, поведенческие — про взаимодействие.
- Классификация — это навигатор: определите тип проблемы, и круг кандидатов сузится.
- Деление «класс/объект» подсказывает: композиция обычно гибче наследования.