🚨 ¡Nueva review! ✨ Mi ratón favorito para programar: el Logitech MX Master 3S . ¡Échale un ojo! 👀

El Patrón de diseño Template Method

La receta de la yaya, pero con tu toque personal.

Escrito por domin el 6 de diciembre de 2025

🍳 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.

Diagrama del Patrón Template Method.

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):

  1. Hervir agua (Igual para todos).
  2. Preparar ingrediente (Café: filtrar. Té: infusionar).
  3. Servir en taza (Igual para todos).
  4. 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

2. Métodos Concretos

3. Métodos Abstractos (Hooks)

🤔 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?

  1. Reutilización: Elevas el código común a la superclase.
  2. 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

🤔 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! 🍻