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.