Está en la página 1de 2

Patrn factoria

Otro patrn ms, el patrn factoria.



Supongamos que vamos a hacer una aplicacin y en ella hay que pedir en varias ventanas
(pongamos en unas 500 ventanas, para ser bestias) una fecha. Por ejemplo, si estamos
haciendo una especie de agenda con listn de amigos, debemos poner fechas de las citas,
fechas de los cumpleaos, fecha para alarmas, aniversarios, eventos, etc, etc.

Como somos muy hbiles programando, nos hacemos una clase EditorFecha. Adems,
como programamos en java, esa claseEditorFecha en un JTextField en el que se pone la
fecha y le hemos aadido unos mtodos dameFecha() y tomaFecha() que nos devuelven
o admiten directamente un Date. De esta manera nos ahorramos la traduccin
de String a Date en todos los sitios.

Hacemos nuestra aplicacin y en el panel/formulario que nos permite crear un nuevo
amigo ponemos un "new EditorFecha()". En el panel/formulario que nos permite editar
un nuevo amigo ponemos otro "new EditorFecha()". En el que nos permite aadir una
nueva cita ponemos otro "new EditorFecha()", etc, etc. As en las 500 ventanas que
mencionamos al principio hacemos nuestros 500 "new EditorFecha()".

Ya contentos con nuestra aplicacin que funciona estupendamente se la enseamos a
nuestro mejor amigo (habitualmente nuestro jefe que nos la ha encargado). Nuestro
amigo nos dice que la aplicacin es estupenda, pero que para meter la fecha es ms
cmodo usar la clase JCalendar que te puedes bajar gratis de internet. Esa clase tiene
un botoncito que cuando le damos nos abre un calendario en el que elegimos la fecha
con un click de ratn y ya est.

Nos parece buena idea, nos bajamos JCalendar y nos ponemos a cambiar cdigo. Ay
desgraciados de nosotros !!. Cuando hemos cambiado 133 "new EditorFecha()" por 133
"new JCalendar()" y hemos cambiado 133 "dameFecha()" por 133 "getDate()" nos hemos
hartado, mandamos todo a freir esprragos. Y hemos sido demasiado pacientes, hemos
llegado a cambiar 133 editores.

Cmo hubiera sido la forma correcta de hacer esto para que el cambio no nos suponga
semejante trauma?. El patrn factora nos da una posible solucin.

Cuando preveamos que una clase puede cambiarse por otra o mejorarse (aunque sea
remotamente), debemos hacerlo de la siguiente manera.

Primero hacemos una interface para esa clase con los mtodos que queramos que tenga.
Por ejemplo, nuestraInterfaceEditorFecha puede ser como esto

public interface InterfaceEditorFecha
{
public Date dameFecha();
publid void tomaFecha(Date unaFecha);
}

Ahora hacemos nuestro EditorFecha implementando esa interface.

Finalmente, hacemos una clase factora con un mtodo esttico que nos de un editor
nuevo cada vez que la llamemos y nos lo devuelva como esa interface. Puede ser algo
como esto

public class FactoriaEditorFecha
{
public InterfaceEditorFecha dameNuevoEditor ()
{
return new EditorFecha();
}
}

Ya est. En nuestro cdigo, en vez de hacer "new EditorFecha()", hacemos
"FactoriaEditorFecha.dameNuevoEditor()" para ir construyendo nuestros editores.

Ahora viene el "amigo" del JCalendar y nos da su sabio consejo. Hacemos una clase que
herede de JCalendar y que implemente nuestra interface. Los dos mtodos que
queremos que tenga nicamente deben hacer la traduccin a los deJCalendar. Para esto
existe otra cosa que se llama patrn adaptador, pero ya escribir ms adelante sobre l.

public class MiJCalendar extends JCalendar implements InterfaceEditorFecha
{

public void tomaFecha (Date unaFecha)
{
this.setDate(unaFecha);
}

public Date dameFecha ()
{
return this.getDate();
}

}

y simplemente cambiando en nuestra clase FactoriaEditorFecha el "new EditorFecha()"
por "new MiJCalendar()" ya tenemosTODA la aplicacin cambiada.

En realidad el patrn factora es algo ms complejo y permite incluso cambiar el new
que hace sin necesidad de tocar el cdigo de la clase Factora, pero ya me parece liar
mucho para un primer vistazo.

Una cosa importante, JCalendar existe, pero me he inventado sus mtodos por pereza y
por simplificar un poco.

También podría gustarte