Beruflich Dokumente
Kultur Dokumente
Define una interfaz para crear un objeto, pero deja que sean las subclases quienes decidan qué
clase instanciar. Permite que una clase delegue en sus subclases la creación de objetos.
El patrón de diseño Factory Method consiste en definir una interfaz para crear objetos de tipo
genérico permitiendo a las subclases decidir qué tipo de objetos concreto crear.
Características:
• Clasificación: creacional
• Hace que un diseño sea más personalizable y sólo un poco más complicado. El Factory
Method sólo requiere una nueva operación.
Ventajas:
El patrón Factory Method permite escribir aplicaciones que son más flexibles
respecto de los tipos a utilizar, difiriendo la creación de las instancias en el sistema
a subclases que pueden ser extendidas a medida que evoluciona el sistema.
Permite también encapsular el conocimiento referente a la creación de objetos.
Factory Method hace también que el diseño sea más adaptable a cambio de sólo un
poco más de complejidad.
Desventaja:
Se obliga al cliente a definir subclases de la clase “Creador” sólo para crear un producto
concreto y esto puede no ser apropiado siempre.
Ejemplo:
En el API de Java podemos encontrar un ejemplo del uso de este patrón en la clase abstracta
“java.util.Calendar”.
La clase Calendar es una clase abstracta base para convertir entre un objeto de tipo Date
(java.util.Date) y un conjunto de campos enteros como YEAR (año), MONTH (mes), DAY (día),
HOUR (hora), etc.
Una subclase de Calendar representa una fecha de acuerdo a las reglas de un calendario
específico. La plataforma provee una subclase concreta de Calendar: GregorianCalendar.
Futuras subclases podrían representar varios tipos de calendarios lunares usados en diferentes
lugares del mundo.
Esto puede parecer un tanto abstracto pero se deben evitar confusiones. La clase Calendar tiene
mucho del comportamiento que esperaríamos de la clase java.util.Date, es decir, cuando
obtenemos una instancia de la clase Calendar obtenemos un instante de tiempo específico con
gran precisión similar a lo que obtenemos con la clase date.
Se puede decir aquí que los milisegundos juegan un papel fundamental en esta clase; pero el
verdadero sentido de la clase Calendar no es obtener un instante de tiempo sino extraerle datos.
Recordemos que la clase java.util.Date tiene métodos que permiten obtener el año, mes y día,
pero estos métodos están obsoletos precisamente porque para eso existe Calendar y de hecho
cuando usamos el método getYear() de la clase java.util.Date esta recurre a las funcionalidades
que posee la clase Calendar.
Hay que mencionar también que obtener un instante de tiempo específico y diferente del actual
es supremamente sencillo con esta clase, indicándole simplemente el día, mes y año con que se
desea trabajar, o se puede especificar aún más dando hora, minuto y segundo deseado. Veamos:
El método getInstance() de la clase es el que utiliza el patrón de diseño Factory Method, ya nos
devuelve una subclase de Calendar, ya especificada, con el tiempo ajustado a la hora actual. En
el ejemplo, usamos el método set(args…) para forzarlo a tomar la fecha deseada:
Calendar CalActual = Calendar.getInstance();
System.out.println(CalActual.getClass());
CalActual.set(2004,1,7);
System.out.println(CalActual.getTime());
CalActual.set(2004,1,7,7,0,0);
System.out.println(CalActual.getTime());
La primera línea devuelve una instancia de GregorianCalendar, es aquí donde es más clara la
utilización del patrón, pues esta clase ya está previamente creada en la familia de subclases que
Calendar posee, y las cuales se pueden comportar de manera diferente.
Esta primera línea devuelve un calendario con la fecha y hora actual, y el método getTime()
retorna un objeto de tipo java.util.Date que se muestra en consola posteriormente.
En la tercera línea se usa el método set para ajustar la fecha al "7 de enero de 2004" y en la
quinta ponemos la misma fecha pero esta vez ajustando también la hora, minutos y segundos,
es decir: "7 de la noche del 7 de enero de 2004".