Sie sind auf Seite 1von 5

Factory Method:

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.

 Product: define la interfaz de los objetos que crea el Factory Method.


 ConcreteProduct implementa la interfaz Product.
 Factory declara el método FactoryMethod, que retorna el objeto Product.
 ConcreteCreator sobrescribe el método generado para crear objetos de tipo
ConcreteProduct.

Características:

• Clasificación: creacional

• Se lo conoce Virtual Constructor.

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

• Es similar a la Abstract Factory, pero sin el énfasis en las familias.

• Es de rutina, especificados por un marco arquitectónico, y luego implementar por parte


del usuario la estructura.

• A este método se lo utiliza con el método plantilla.

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

La salida en consola será (note que tiene el formato de java.util.Date):

Sat Feb 07 19:55:47 GMT-05:00 2004


Sat Feb 07 07:00:00 GMT-05:00 2004

En la siguiente imagen podemos ver un ejemplo de la clase java.util.Calendar y sus distintas


instancias, evidenciando el uso del patrón Factory Method:
Un ejemplo en la vida real podría ser el caso de un hotel:

Cuando llegamos al hotel primeramente debemos registrarnos. La persona encargada de la


recepción nos otorga una llave de nuestra habitación, luego de haber pagado por ella. Esta
forma puede verse como una “Fabrica de Habitaciones”. Además, mientras nos quedamos en
el hotel, si queremos hacer una llamada, necesitaremos llamar a recepción, y la persona
encargada nos conectará con el número que necesitemos. Esta forma puede percibirse como
una “Fabrica de Llamadas”, porque la persona en recepción controla el acceso a las llamadas
también.

Das könnte Ihnen auch gefallen