DevLearn logo
Skill Up With Me
Interactive Learning
Signing in…

Описание и сравнение

🔒 Sign in to use this

Паттерны проектирования — это многократно применимые решения задач, которые часто встречаются при разработке программного обеспечения. Это не готовые куски кода, которые можно вставить — это чертежи, шаблоны для решения целого класса проблем. Паттерн описывает проблему, объясняет, почему наивные решения не работают, и предлагает проверенную структуру. Паттерны пришли из архитектурных работ Кристофера Александера и были перенесены в разработку ПО «Бандой четырёх» (Гамма, Хелм, Джонсон, Влиссидес) в их книге 1994 года «Паттерны проектирования: элементы повторно используемого объектно-ориентированного программного обеспечения».

ℹ️Паттерн — это не алгоритм. Алгоритм определяет точную последовательность шагов. Паттерн — это высокоуровневое описание решения. Один и тот же паттерн можно реализовать по-разному в разных языках и контекстах.
Зачем знать паттерны
Кликните на каждую карточку, чтобы понять, что даёт знание паттернов
🗣️
Общий словарь
Проверенные решения
📐
Принципы проектирования
🔄
Гибкость
🤝
Командная коммуникация
🔍
Распознавание паттернов
Три категории

«Банда четырёх» классифицировала все 23 паттерна по трём категориям в зависимости от назначения. Порождающие паттерны отвечают за создание объектов. Структурные паттерны — за то, как объекты объединяются в более крупные структуры. Поведенческие паттерны — за коммуникацию и распределение ответственности между объектами. Понимание категории сразу говорит, какую проблему решает паттерн.

Наведите курсор на кольцо, чтобы увидеть входящие в него паттерны
ПоведенческиеСтруктурныеПорождающие
Наведите курсор на кольцо, чтобы увидеть входящие в него паттерны
Порождающие паттерны: обзор

Порождающие — создание объектов

Порождающие паттерны абстрагируют процесс инстанциирования. Они помогают сделать систему независимой от того, как создаются, компонуются и представляются её объекты. Вместо прямого вызова конструкторов вы обращаетесь через интерфейс — фабричный метод, объект-фабрику, строитель, клон или статический аксессор. Это даёт гибкость: менять что создаётся, как создаётся и когда создаётся — не затрагивая клиентский код. По мере роста систем создание объектов становится нетривиальной задачей: может понадобиться пул объектов, гарантия уникальности, поддержка нескольких представлений или отложенная дорогостоящая инициализация. Порождающие паттерны решают всё это.
Фабричный метод
Абстрактная фабрика
Строитель
Прототип
Одиночка
Кликните на каждый порождающий паттерн, чтобы увидеть сводку
🏭
Фабричный метод
🏗️
Абстрактная фабрика
🔨
Строитель
📋
Прототип
🔑
Одиночка
Структурные паттерны: обзор

Структурные — композиция объектов

Структурные паттерны касаются того, как классы и объекты компонуются в более крупные структуры. Структурные паттерны на основе классов используют наследование для компоновки интерфейсов. Паттерны на основе объектов описывают способы компоновки объектов для получения новой функциональности. Ключевое понимание: гибкий дизайн часто возникает не из иерархий наследования, а из того, как объекты ссылаются друг на друга и делегируют работу. Структурные паттерны позволяют собирать объекты в новые структуры без переписывания задействованных классов. Особенно ценны при интеграции сторонних библиотек, построении многоуровневых архитектур или оптимизации памяти для больших графов объектов.
Адаптер
Мост
Компоновщик
Декоратор
Фасад
Приспособленец
Заместитель
Кликните на каждый структурный паттерн, чтобы увидеть сводку
🔌
Адаптер
🌉
Мост
🌳
Компоновщик
🎁
Декоратор
🏛️
Фасад
🍃
Приспособленец
🔀
Заместитель
Поведенческие паттерны: обзор

Поведенческие — коммуникация объектов

Поведенческие паттерны характеризуют способы взаимодействия классов или объектов и распределения ответственности. Они смещают фокус со структуры на коммуникацию: кто кому отправляет сообщения, в каком порядке и кто что обрабатывает. Многие из этих паттернов отделяют отправителей от получателей — отправитель не знает, кто обработает запрос и обработает ли вообще. Другие инкапсулируют алгоритмы для замены во время выполнения или сохраняют и восстанавливают состояние объекта. Поведенческие паттерны — это место, где происходит большинство ежедневных решений по дизайну: как события текут через систему, как маршрутизируются запросы, как моделируются конечные автоматы и как реализуется функциональность отмены действий.
Цепочка обязанностей
Команда
Итератор
Посредник
Снимок
Наблюдатель
Состояние
Стратегия
Шаблонный метод
Посетитель
Кликните на каждый поведенческий паттерн, чтобы увидеть сводку
⛓️
Цепочка обязанностей
📦
Команда
🔁
Итератор
📡
Посредник
📸
Снимок
👁️
Наблюдатель
🔀
Состояние
🎯
Стратегия
📋
Шаблонный метод
🧳
Посетитель
Все 23 паттерна: полная шкала
Кликните на каждую категорию, чтобы увидеть входящие паттерны
Порождающие
П
5
Структурные
С
7
Поведенческие
П
10
Сравнение часто путаемых паттернов

Ряд паттернов схожи внешне — оба оборачивают объекты или оба определяют интерфейсы — но решают принципиально разные проблемы. Следующие сравнения проясняют намерение каждой пары или группы.

Фабричный метод vs Абстрактная фабрика vs Строитель
Кликните, чтобы разобраться в трио порождающих паттернов
🏭
Фабричный метод
🏗️
Абстрактная фабрика
🔨
Строитель
Адаптер vs Декоратор vs Заместитель
Кликните, чтобы разобраться в трёх паттернах-обёртках
🔌
Адаптер
🎁
Декоратор
🔀
Заместитель
Стратегия vs Состояние vs Шаблонный метод
Кликните для сравнения трёх поведенческих паттернов, связанных с алгоритмами
🎯
Стратегия
🔀
Состояние
📋
Шаблонный метод
Наблюдатель vs Посредник vs Цепочка обязанностей
Кликните для сравнения трёх паттернов развязки
👁️
Наблюдатель
📡
Посредник
⛓️
Цепочка обязанностей
Компоновщик vs Декоратор
Кликните для сравнения двух паттернов, использующих рекурсивную композицию
🌳
Компоновщик
🎁
Декоратор
Принципы проектирования за паттернами

Принципы, которые применяют паттерны

Паттерны не придуманы произвольно — каждый является прямым применением одного или нескольких фундаментальных принципов проектирования. Понимание принципа, лежащего в основе паттерна, помогает распознать, когда его применять и когда достаточно более простого решения. «Банда четырёх» выделила два ключевых принципа, лежащих в основе почти всех 23 паттернов: «Программируйте к интерфейсу, а не к реализации» — что обеспечивает всю полиморфную гибкость — и «Предпочитайте композицию объектов наследованию классов» — что избегает проблемы хрупкого базового класса и обеспечивает гибкость в рантайме. Из этих двух принципов, плюс SOLID (особенно OCP и DIP), весь каталог паттернов следует естественным образом.
Программируйте к интерфейсам
Предпочитайте композицию
Принцип открытости/закрытости
Инверсия зависимостей
Единственная ответственность
Подстановка Лисков
Не повторяйся (DRY)
Кликните на каждый принцип, чтобы увидеть, какие паттерны применяют его напрямую
🔓
Принцип открытости/закрытости
🔄
Инверсия зависимостей
🎯
Единственная ответственность
🧩
Предпочитайте композицию
Когда НЕ нужно использовать паттерны
Кликните на каждый анти-пример, чтобы понять опасность
Преждевременная абстракция
🚢
Карго-культ
🔧
Несоответствие паттерна
🏰
Оверинжиниринг
Паттерны в современных Java-фреймворках

Где вы видите паттерны каждый день

Паттерны проектирования — это не академические упражнения: они являются невидимым каркасом каждого крупного Java-фреймворка и библиотеки, которые вы используете. Spring Framework — настоящая витрина паттернов: его IoC-контейнер — это Dependency Injection (вариант Стратегии + Фабрики), @Transactional использует динамический Заместитель, @Async использует Заместитель, ApplicationEvent использует Наблюдатель, RestTemplate использует Шаблонный метод, а DispatcherServlet Spring MVC использует Цепочку обязанностей для маршрутизации запросов. Hibernate использует Заместитель для ленивой загрузки сущностей, Identity Map (аналог Приспособленца) для кэша сессии и Repository (Фасад) для доступа к базе данных. Пакет java.io полностью построен на Декораторе (обёртки InputStream). JDBC использует Мост между стандартным API и реализациями поставщиков. JavaFX и Swing используют Компоновщик для дерева компонентов и Наблюдатель для слушателей событий. Знать паттерны — значит понимать, как работают фреймворки, а не просто уметь вызывать их API.
Spring IoC
@Transactional Proxy
ApplicationEvent
Hibernate Proxy
java.io Decorator
JDBC Bridge
Swing Composite
Кликните на выделенные строки, чтобы найти паттерн внутри Spring и Java SE
java
1
// ── Наблюдатель ──────────────────────────────────────────────────
2
@EventListener
3
public void onOrderPlaced(OrderPlacedEvent event) { ... }
4
5
// ── Заместитель (@Transactional) ─────────────────────────────────
6
@Transactional
7
public void transferFunds(Account from, Account to, BigDecimal amount) { ... }
8
9
// ── Шаблонный метод ──────────────────────────────────────────────
10
JdbcTemplate.query(sql, rowMapper);
11
12
// ── Декоратор (java.io) ──────────────────────────────────────────
13
new BufferedReader(new InputStreamReader(socket.getInputStream()));
14
15
// ── Стратегия ────────────────────────────────────────────────────
16
list.sort(Comparator.comparing(Person::getName));
Ключевой вывод: паттерны проектирования — это язык, словарь для принятия решений по дизайну. Освоить их не значит заучить 23 диаграммы классов. Это значит понять задачи, которые они решают, научиться распознавать эти задачи в собственном коде и знать, когда выгода паттерна превышает его стоимость.
ℹ️Что дальше: следующие главы подробно разбирают каждый паттерн — с интерактивными диаграммами, полными примерами кода и реальными ссылками на библиотеки Java. Начните с Порождающих паттернов, затем переходите к Структурным, затем к Поведенческим. Каждый урок опирается на словарь, введённый здесь.
🔒 Sign in to use this