Что это такое
Паттерн Template Method (шаблонный метод) закрепляет каркас алгоритма — шаги и их порядок, — позволяя при этом менять отдельные шаги. Рецепт написан один раз; каждый вариант подставляет свои шаги.
В PHP это делается классическим способом: абстрактному базовому классу (abstract) принадлежит final-метод с каркасом, а методы abstract protected — это шаги, которые обязан предоставить каждый подкласс.
Пример: один рецепт, два напитка
Порядок принадлежит методу make(): закипятить, заварить, разлить, добавки. Чай и кофе отвечают только на вопросы как заваривать и что добавить — final означает, что они не могут переставить или пропустить шаги.
Каркас остаётся неизменным
Оба напитка проходят одни и те же четыре шага в одном и том же порядке, потому что порядок живёт в одном final-методе. Новый напиток реализует два метода и наследует всю дисциплину целиком.
Вывод: PHP-скрипт
<?php
abstract class Drink {
public function __construct(protected string $name) {}
// Фиксированный каркас — final, поэтому ни один напиток не может переставить шаги.
final public function make(): void {
echo "-- ", $this->name, "\n";
echo "кипятим воду\n";
echo $this->brew(), "\n";
echo "разливаем по чашкам\n";
echo $this->extras(), "\n";
}
// Переменные шаги, которые обязан заполнить каждый напиток.
abstract protected function brew(): string;
abstract protected function extras(): string;
}
class Tea extends Drink {
protected function brew(): string { return "настаиваем чайные листья"; }
protected function extras(): string { return "добавляем лимон"; }
}
class Coffee extends Drink {
protected function brew(): string { return "проливаем воду через кофе"; }
protected function extras(): string { return "добавляем молоко"; }
}
(new Tea("tea"))->make();
(new Coffee("coffee"))->make();
Когда его применять
Применяйте, когда несколько процедур используют одну и ту же фиксированную последовательность с разными деталями — генерация отчётов, конвейеры импорта, подготовка тестов.
Откажитесь, когда вариантам нужен ещё и разный порядок: попытка загнать их под один каркас сгибает паттерн до поломки. А при одном варианте каркас — это просто функция.
Плюсы и минусы
Плюсы: последовательность закреплена в одном месте; варианты не могут забыть или перетасовать шаги; общие шаги написаны один раз.
Минусы: жёсткость по самой сути — вариант, которому нужно «почти то же самое, но…», борется с каркасом; слишком много методов-хуков делают рецепт трудным для восприятия.