[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-patterny-chto-takoe-pattern-template-method":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":16,"progress":17,"seo":18},1266,"chto-takoe-pattern-template-method",40,"patterny","Паттерны","🧩","Что такое паттерн Template Method?","Template Method -- паттерн, определяющий скелет алгоритма в базовом классе, позволяя подклассам переопределять отдельные шаги без изменения общей структуры.\n\n> Аналогия из жизни: Template Method -- как рецепт теста для пиццы. Шаги всегда одинаковы (замесить, раскатать, выложить начинку, запечь), но начинка у каждой пиццы своя.\n\n\u003Cdetails>\n\u003Csummary>Пример кода\u003C\u002Fsummary>\n\n```java\nabstract class ReportGenerator {\n    \u002F\u002F Template Method -- определяет порядок шагов\n    final void generateReport() {\n        fetchData();\n        processData();\n        formatReport();\n        deliver();\n    }\n\n    abstract void fetchData();\n    abstract void processData();\n\n    void formatReport() { \u002F* формат по умолчанию -- PDF *\u002F }\n    void deliver() { \u002F* email по умолчанию *\u002F }\n}\n\nclass SalesReport extends ReportGenerator {\n    void fetchData() { \u002F* запрос к БД продаж *\u002F }\n    void processData() { \u002F* агрегация по регионам *\u002F }\n    \u002F\u002F formatReport() и deliver() используют реализацию по умолчанию\n}\n\nclass InventoryReport extends ReportGenerator {\n    void fetchData() { \u002F* запрос к складской БД *\u002F }\n    void processData() { \u002F* подсчёт остатков *\u002F }\n    @Override void deliver() { \u002F* выгрузка в S3, а не email *\u002F }\n}\n```\n\n\u003C\u002Fdetails>\n\n### Примеры Template Method в JDK и Spring\n\n- `AbstractList.get()` -- подклассы определяют доступ к элементам\n- `HttpServlet.doGet()` \u002F `doPost()` -- скелет обработки запроса\n- Spring `JdbcTemplate.query()` -- скелет работы с JDBC (открытие\u002Fзакрытие соединений)\n\n### Template Method vs Strategy\n\n| Критерий | Template Method | Strategy |\n|----------|----------------|----------|\n| Механизм | Наследование | Композиция |\n| Что меняется | Отдельные шаги алгоритма | Весь алгоритм целиком |\n| Связность | Сильная (подкласс привязан к базовому) | Слабая (стратегия независима) |\n| Тренд 2026 | Используется в framework-коде | Предпочтительнее для бизнес-логики |\n\n### Частые ошибки\n\n- Слишком много абстрактных шагов -- класс становится невозможно реализовать\n- Глубокая иерархия -- Template Method провоцирует наследование; предпочитайте Strategy (композиция)\n\n### Как используется в 2026\n\n- Spring `*Template` классы -- JdbcTemplate, RestTemplate, KafkaTemplate\n- \"Голливудский принцип\": не звоните нам, мы сами вам позвоним (framework вызывает ваш код)\n- Тренд: Strategy (композиция) предпочтительнее Template Method (наследование) для новых проектов\n\n> **На собеседовании:** назовите JdbcTemplate как пример и объясните \"Голливудский принцип\". Частая ошибка -- не упомянуть, что template method должен быть final, чтобы подклассы не могли изменить порядок шагов.","","middle",[15],"patterns",[],null,{"title":19,"description":20,"ogTitle":19,"ogDescription":21,"keywords":22,"schemaAnswer":20,"featuredSnippetReady":23},"Что такое паттерн Template Method? — Gymterview","Template Method -- паттерн, определяющий скелет алгоритма в базовом классе, позволяя подклассам переопределять отдельные шаги без изменения общей структуры.","Template Method -- паттерн, определяющий скелет алгоритма в базовом классе, позволяя подклассам переопределять отдельные",[15,13],true]