middle
Что такое паттерн Template Method?
Template Method – паттерн, определяющий скелет алгоритма в базовом классе, позволяя подклассам переопределять отдельные шаги без изменения общей структуры.
Аналогия из жизни: Template Method – как рецепт теста для пиццы. Шаги всегда одинаковы (замесить, раскатать, выложить начинку, запечь), но начинка у каждой пиццы своя.
Пример кода
abstract class ReportGenerator {
// Template Method -- определяет порядок шагов
final void generateReport() {
fetchData();
processData();
formatReport();
deliver();
}
abstract void fetchData();
abstract void processData();
void formatReport() { /* формат по умолчанию -- PDF */ }
void deliver() { /* email по умолчанию */ }
}
class SalesReport extends ReportGenerator {
void fetchData() { /* запрос к БД продаж */ }
void processData() { /* агрегация по регионам */ }
// formatReport() и deliver() используют реализацию по умолчанию
}
class InventoryReport extends ReportGenerator {
void fetchData() { /* запрос к складской БД */ }
void processData() { /* подсчёт остатков */ }
@Override void deliver() { /* выгрузка в S3, а не email */ }
}
Примеры Template Method в JDK и Spring
AbstractList.get()– подклассы определяют доступ к элементамHttpServlet.doGet()/doPost()– скелет обработки запроса- Spring
JdbcTemplate.query()– скелет работы с JDBC (открытие/закрытие соединений)
Template Method vs Strategy
| Критерий | Template Method | Strategy |
|---|---|---|
| Механизм | Наследование | Композиция |
| Что меняется | Отдельные шаги алгоритма | Весь алгоритм целиком |
| Связность | Сильная (подкласс привязан к базовому) | Слабая (стратегия независима) |
| Тренд 2026 | Используется в framework-коде | Предпочтительнее для бизнес-логики |
Частые ошибки
- Слишком много абстрактных шагов – класс становится невозможно реализовать
- Глубокая иерархия – Template Method провоцирует наследование; предпочитайте Strategy (композиция)
Как используется в 2026
- Spring
*Templateклассы – JdbcTemplate, RestTemplate, KafkaTemplate - “Голливудский принцип”: не звоните нам, мы сами вам позвоним (framework вызывает ваш код)
- Тренд: Strategy (композиция) предпочтительнее Template Method (наследование) для новых проектов
На собеседовании: назовите JdbcTemplate как пример и объясните “Голливудский принцип”. Частая ошибка – не упомянуть, что template method должен быть final, чтобы подклассы не могли изменить порядок шагов.