Gymterview
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, чтобы подклассы не могли изменить порядок шагов.