Шпаргалка: GoF и Enterprise
Паттерн — это проверенный рецепт для типовой задачи проектирования. Не код для копирования, а идея «как обычно решают вот это». Ниже — карта самых частых паттернов с примерами прямо из Java и Spring, которые ты уже видел.
Если спрашивают на собесе…
| Вопрос | Паттерн |
|---|---|
| «Один объект на всё приложение?» | Singleton |
| «Сложный объект с кучей полей?» | Builder |
| «Сменить библиотеку без боли?» | Adapter |
| «Добавить логирование/кэш к классу?» | Proxy / Decorator |
| «Спрятать сложную систему за простым API?» | Facade |
| «Дать выбрать алгоритм (оплату, сортировку)?» | Strategy |
| «Уведомить всех, когда что-то случилось?» | Observer |
| «Цепочка проверок/фильтров?» | Chain of Responsibility |
Копнуть глубже — GoF по группам
Порождающие (как создавать объекты):
| Паттерн | Суть | Пример в Java/Spring |
|---|---|---|
| Singleton | один экземпляр класса | Spring Beans, Runtime, Logger |
| Factory Method | подкласс решает, что создать | Calendar.getInstance() |
| Abstract Factory | семейства связанных объектов | DocumentBuilderFactory |
| Builder | пошаговая сборка сложного объекта | StringBuilder, Lombok @Builder |
| Prototype | клонирование вместо new | Object.clone(), @Scope("prototype") |
Структурные (связи между классами):
| Паттерн | Суть | Пример |
|---|---|---|
| Adapter | совместить несовместимые интерфейсы | InputStreamReader, slf4j |
| Decorator | добавить поведение динамически | BufferedReader(new FileReader()) |
| Facade | простой фасад над сложным | Spring Boot, JdbcTemplate |
| Proxy | контроль доступа (ленивость, логи) | @Transactional, Hibernate lazy |
| Composite | группа объектов как один | UI-компоненты, файловая система |
| Flyweight | общий кэш для экономии памяти | Integer.valueOf(), String Pool |
Поведенческие (взаимодействие объектов):
| Паттерн | Суть | Пример |
|---|---|---|
| Strategy | взаимозаменяемые алгоритмы | Comparator, способы оплаты |
| Observer | оповещение зависимых об изменениях | @EventListener, Kafka Listener |
| Chain of Responsibility | запрос идёт по цепочке | Servlet Filters, Security Filter Chain |
| Template Method | скелет алгоритма, шаги в подклассах | JdbcTemplate, RestTemplate |
| Command | запрос как объект | Runnable, Callable |
| Iterator | обход коллекции без деталей | Iterator, for-each |
| State | поведение зависит от состояния | Order со статусами, FSM |
Под капотом — Enterprise-паттерны (Spring/микросервисы)
| Паттерн | Суть | Пример |
|---|---|---|
| Repository | слой доступа к данным | Spring Data JpaRepository |
| Unit of Work | отслеживание изменений в транзакции | Hibernate Session, @Transactional |
| Dependency Injection | зависимости приходят извне | весь Spring (@Autowired) |
| Front Controller | единая точка входа | DispatcherServlet |
| MVC | разделение данных/вида/логики | Spring MVC |
| CQRS | разделить чтение и запись | read/write реплики, Axon |
| Event Sourcing | состояние как поток событий | Kafka, EventStore |
| Saga | распределённые транзакции через компенсации | оркестраторы микросервисов |
| Null Object | пустой объект вместо null | Collections.emptyList(), Optional |
Главное: ты уже пользовался этими паттернами, не зная названий. Spring — это огромный набор паттернов под капотом. Цель не зазубрить, а уметь узнать паттерн в коде и назвать его на собесе.
🎤 Закрыл тему, если можешь объяснить:
• что такое паттерн и зачем он нужен;
• приведи по одному примеру порождающего, структурного и поведенческого;
• где в Spring живут Proxy и Singleton (если дошёл до 3-го слоя).
• приведи по одному примеру порождающего, структурного и поведенческого;
• где в Spring живут Proxy и Singleton (если дошёл до 3-го слоя).