Шаблоны проектирования
Паттерн — это именованная схема взаимодействия объектов для повторяющейся задачи проектирования. Это не готовый фрагмент кода: роли сохраняются, а классы, границы и детали реализации зависят от системы.
Паттерн полезен как инженерный словарь. Фраза «перед внешним API стоит адаптер» быстрее передаёт устройство решения, если команда одинаково понимает назначение, ограничения и цену Adapter.
Паттерн, принцип и алгоритм
- принцип задаёт критерий хорошего решения, например зависимость от абстракций;
- паттерн описывает роли и связи в типовой ситуации;
- алгоритм определяет последовательность вычислительных шагов;
- framework предоставляет готовый каркас и управляет жизненным циклом кода.
Назвать класс Factory недостаточно. Нужно показать, какую зависимость скрывает
создание и почему обычный конструктор хуже в данном контексте.
Карта выбора
| Вопрос | Первая гипотеза |
|---|---|
| Как пошагово собрать объект с инвариантами? | Строитель Builder |
| Как оставить подклассу выбор создаваемого типа? | Фабричный метод Factory Method |
| Как создавать согласованное семейство объектов? | Абстрактная фабрика Abstract Factory |
| Как получить вариант из готовой настройки? | Прототип Prototype |
| Как согласовать два несовместимых API? | Адаптер Adapter |
| Как комбинировать дополнительные обязанности? | Декоратор Decorator |
| Как контролировать доступ к объекту? | Заместитель Proxy |
| Как скрыть устройство коллекции при обходе? | Итератор Iterator |
| Как зафиксировать каркас алгоритма? | Шаблонный метод Template Method |
| Как найти обработчика по цепи? | Цепочка обязанностей Chain of Responsibility |
Три группы
- Порождающие паттерны отвечают за место и правила создания объектов;
- Структурные паттерны связывают объекты и интерфейсы;
- Поведенческие паттерны распределяют алгоритмы и коммуникацию.
Классификация помогает найти раздел, но не выбирает решение автоматически. Например, Decorator и Chain внешне выглядят как вложенные объекты, однако имеют разные контракты прохождения вызова.
Как разбирать паттерн
- Сформулировать проблему без названия паттерна.
- Найти изменяющуюся часть и стабильный контракт.
- Назвать роли и направление зависимостей.
- Проверить, что будет при добавлении нового варианта.
- Оценить цену: новые типы, косвенность, состояние и сложность диагностики.
- Сравнить с ближайшим паттерном и с простым решением без паттерна.
Что важно на собеседовании
- объяснить задачу, а не воспроизвести диаграмму;
- привести небольшой пример из стандартной библиотеки или собственного кода;
- назвать компромисс и условие, когда паттерн избыточен;
- отличить похожие решения: Factory Method от простой фабрики, Adapter от Decorator, Template Method от Strategy;
- видеть паттерны в Java API:
Iterable, обёртки потоков, proxy-механизмы.
Связи: Паттерны, Принципы SOLID, Основы ООП.