💡 Ver Caso Práctico: Ejemplo Práctico del Patrón Template Method
Template Method (Método Plantilla) es un patrón de diseño comportamental que define el esqueleto de un algoritmo en la superclase, dejando que las subclases sobrescriban pasos concretos sin cambiar la estructura general.
Propósito y Caso de Uso
Utiliza Template Method cuando varios algoritmos comparten la misma secuencia de pasos pero difieren en la implementación de algunos de ellos (ej. distintos formatos de exportación: PDF, CSV, Excel, todos con "cargar datos → transformar → escribir cabecera → escribir filas"). A diferencia de Strategy (que delega el algoritmo completo a un objeto externo), Template Method usa herencia y fija el flujo en la clase base.
Estructura del Patrón
- Clase Abstracta: Define el método plantilla (
execute()) que orquesta los pasos en orden fijo, y deja algunos como abstractos. - Subclases Concretas: Implementan únicamente los pasos variables, heredando el resto del flujo.
- Pasos Opcionales (Hooks): Métodos con implementación por defecto que las subclases pueden sobrescribir si lo necesitan.
Flujo de Funcionamiento
- Invocación única: El cliente llama al método plantilla de la clase base.
- Ejecución en orden fijo: La clase base recorre los pasos definidos, algunos propios y otros delegados.
- Personalización por subclase: Cada paso abstracto es resuelto por la subclase concreta usada.
Ejemplos de Implementación Reales
abstract class ReportGenerator {
// Método plantilla: define el orden, no se sobrescribe
generate(data: unknown[]): string {
const transformed = this.transform(data);
const header = this.header();
const rows = this.rows(transformed);
return `${header}\n${rows}`;
}
protected abstract transform(data: unknown[]): string[];
protected abstract header(): string;
protected abstract rows(rows: string[]): string;
}
class CsvReport extends ReportGenerator {
protected transform(data: unknown[]): string[] { return data.map((d) => JSON.stringify(d)); }
protected header(): string { return 'id,name,value'; }
protected rows(rows: string[]): string { return rows.join('\n'); }
}
console.log(new CsvReport().generate([{ id: 1 }, { id: 2 }]));Cuándo NO usarlo
Si los algoritmos no comparten estructura común, o se necesita cambiar el algoritmo completo en tiempo de ejecución (no solo pasos), usa mejor Strategy (YAGNIGlosarioYAGNI (You Aren't Gonna Need It)Principio de Extreme Programming (XP) que establece que un programador no debe añadir funcionalidad hasta que sea estrictamente necesario. Su objetivo es evitar la sobre-ingeniería (over-engineering), previniendo código para funcionalidades hipotéticas.Ver término completo →).