Mi granito de java: Template Method

lunes, 13 de junio de 2011

Template Method

Define una estructura algorítmica cuya lógica quedará a cargo de las subclases. Para ello, escribe una clase abstracta que contiene parte de la lógica necesaria para realizar su finalidad. En ella se define una estructura de herencia que sirve de plantilla ("Template" significa plantilla) de los métodos en las subclases.

Dicho de otra forma, define un esqueleto de un algoritmo, delegando algunos pasos a las subclases. Permite redefinir parte de dicho algoritmo sin cambiar su estructura.

Se debe utilizar este patrón cuando.
  • Se quiera factorizar el comportamiento común de varias subclases.
  • Se necesite implementar las partes fijas de un algoritmo una sola vez y dejar que las subclases implementen las partes variables.
  • Se busque controlar las ampliaciones de las subclases, convirtiendo en métodos plantillas aquéllos métodos que pueden ser redefinidos.
Este patrón se vuelve de especial utilidad cuando es necesario realizar un algoritmo que sea común para muchas clases, pero con pequeñas variaciones entre una y otras. En este caso, se deja en las subclases cambiar una parte del algoritmo.

Diagrama UML

AbstractTemplate o AbstractClass: implementa un método plantilla que define el esqueleto de un algoritmo y define métodos abstractos que deben implementar las subclases concretas
TemplateConcreto o ConcreteClass: implementa los métodos abstractos para realizar los pasos del algoritmo que son específicos de la subclase.

Ejemplo

Como ejemplo, imaginemos una empresa que posee socios, clientes, empleados, etc. Cuando se les solicite que se identifiquen, cada uno lo realizará de distinta manera: quizas un empleado tiene un legajo, pero un cliente tiene un numero de cliente, etc.






Consecuencias
  • Favorece la reutilización del código.
  • Lleva a una estructura de control invertido: la superclase base invoca los métodos
  • de las subclases.

3 comentarios:

Cheo´s dijo...

Hola soy estudiante de computación y en una asignación me pidieron un ejemplo de una implementacion de un Factory Method. Este ejemplo que publicaste se ve algo sencillo pero las fotos se ven un poco cortadas.

Podrías publicar el código o enviármelo a esta dirección cheojeg@gmail.com

Anónimo dijo...

Hola, una puntualización, con respecto a este patrón.

No piensas que sería más conveniente, ya que delegas la implementación por medio de metodos "plantilla" a las clases hijas, declarar el método principal identificate() como final??

De esta manera se forzaría a que ninguna clase derivada pudiera sobreescribir el método principal identificate() y sólo pudieran reimplementar los métodos plantilla, por lo que la herencia de implementación sería más segura forzando a reimplementar realmente lo que nos interesa

Un saludo.

Max dijo...

Muy buena idea la del final, se podría hacer como decís.
Con respecto al primer comentario, Cheos te pido disculpas se me paso tu comentario. Aprovecho y te comento que lo único que corto en las fotos son los getters y setters. Lo que realmente importa esta todo. Saludos!