🍳 El Patrón Template Method: La Receta Maestra
El Patrón Template Method (Método Plantilla), define el esqueleto de un algoritmo en una operación, difiriendo algunos pasos a las subclases. Permite que las subclases redefinan ciertos pasos de un algoritmo sin cambiar la estructura del mismo.
El problema que resuelve es este:
¿Cómo evitas duplicar código cuando tienes dos procesos que son casi idénticos, excepto por un par de pasos intermedios?
La respuesta es crear una clase base con un método “plantilla” que llama a otros métodos (algunos ya implementados, otros abstractos). Las subclases solo tienen que implementar esos huecos.

En la imagen podemos ver que, tanto un gato doméstico como uno callejero, seguirán la misma rutina: despertarse, dormir, comer, lavarse y cazar. Pero la implementación cambia. Mientras el gato doméstico caza un ratón de juguete, el callejero caza una rata real. La acción es la misma en la rutina de ambos gatos, pero con distinta implementación.
☕ 1. Un ejemplo sencillo: Café vs Té
Imagina preparar una bebida caliente (El Algoritmo):
- Hervir agua (Igual para todos).
- Preparar ingrediente (Café: filtrar. Té: infusionar).
- Servir en taza (Igual para todos).
- Añadir condimentos (Café: azúcar/leche. Té: limón).
La estructura es la misma, pero los pasos 2 y 4 cambian.
Concepto (Analogía) | Rol en Template Method | Tarea Principal |
|---|---|---|
Receta Genérica | Clase Abstracta | Define el método plantilla (final) y los pasos abstractos. |
Receta de Café / Té | Clases Concretas | Implementan los pasos específicos (preparar, condimentar). |
🛠️ 2. Los tres pilares del patrón Template Method
1. Clase Abstracta
- Contiene el Método Plantilla (suele ser
finalpara que no se sobrescriba). - Contiene métodos concretos (pasos comunes) y métodos abstractos (pasos variables).
2. Métodos Concretos
- Pasos que son iguales para todas las subclases (ej:
hervirAgua()).
3. Métodos Abstractos (Hooks)
- Pasos que cada subclase debe implementar obligatoriamente.
🤔 1. ¿Qué es un 'Hook' (Gancho) en este patrón?
📄 3. El ejemplo clásico: Generador de documentos
Imagina un sistema que exporta datos.
Pasos: abrirArchivo() -> escribirCabecera() -> escribirDatos() -> escribirPie() -> cerrarArchivo().
abrir, cerrar y escribirDatos pueden ser comunes. Pero escribirCabecera y escribirPie dependen de si es PDF, CSV o HTML.
🤔 2. ¿Por qué es buena práctica declarar el Método Plantilla como 'final'?
✅ 4. ¿Por qué usarlo?
- Reutilización: Elevas el código común a la superclase.
- Control: El padre controla el flujo, los hijos solo los detalles. “El Principio de Hollywood: No nos llames, nosotros te llamaremos”.
❌ 5. Desventaja a considerar
- Rigidez: Las subclases están limitadas por el esqueleto proporcionado. Si necesitas cambiar el orden de los pasos para una subclase específica, no puedes.
🤔 3. ¿Qué principio SOLID podría violar este patrón si la clase base tiene demasiadas responsabilidades?
💡 6. Conclusión
El Template Method es la base de la herencia bien hecha. Úsalo para eliminar duplicidad en algoritmos similares.
🧠 7. Ejemplo práctico en PHP
Vamos a cocinar nuestras bebidas.
<?php
// 🔹 1. Clase Abstracta
abstract class BebidaCaliente
{
// El Template Method es FINAL
final public function prepararReceta(): void
{
$this->hervirAgua();
$this->prepararIngrediente();
$this->servirEnTaza();
$this->anadirCondimentos();
}
protected function hervirAgua(): void
{
echo "💧 Herviendo agua...\n";
}
protected function servirEnTaza(): void
{
echo "☕ Sirviendo en la taza...\n";
}
// Pasos abstractos (obligatorios)
abstract protected function prepararIngrediente(): void;
abstract protected function anadirCondimentos(): void;
}
// 🔹 2. Clases Concretas
class Cafe extends BebidaCaliente
{
protected function prepararIngrediente(): void
{
echo "🌑 Filtrando el café...\n";
}
protected function anadirCondimentos(): void
{
echo "🍬 Añadiendo azúcar y leche...\n";
}
}
class Te extends BebidaCaliente
{
protected function prepararIngrediente(): void
{
echo "🌿 Infusionando el té...\n";
}
protected function anadirCondimentos(): void
{
echo "🍋 Añadiendo limón...\n";
}
}
// 🔹 3. Uso
echo "--- Haciendo un Café ---\n";
$cafe = new Cafe();
$cafe->prepararReceta();
echo "\n--- Haciendo un Té ---\n";
$te = new Te();
$te->prepararReceta();
// 🖥️ Salida:
// --- Haciendo un Café ---
// 💧 Herviendo agua...
// 🌑 Filtrando el café...
// ☕ Sirviendo en la taza...
// 🍬 Añadiendo azúcar y leche...
//
// --- Haciendo un Té ---
// 💧 Herviendo agua...
// 🌿 Infusionando el té...
// ☕ Sirviendo en la taza...
// 🍋 Añadiendo limón...
EA, ¡saluditos y nos vemos en los bares! 🍻