Supongamos que tenemos una
librería gráfica similar a la que tengo en mi página.
En ella hay una clase
Lienzo que es la zona de dibujo para dibujar. Hay una clase
EscalaGrafica que es la encargada de hacer las conversiones de coordenadas deseadas para el gráfico a coordenadas de pixels de pantalla y viceversa. Esta clase se encarga, por ejemplo, de hacer las cuentas para que un
Lienzo con 100 pixels de ancho tenga unos valores de x que van de
-PI a
+PI para dibujar una función
sin(x). También hay una clase
Rejilla para dibujar unos ejes y un cuadriculado. Hay una clase
Mano para permitir arrastrar con el ratón un gráfico. Hay unas clases de botonería de zoom para poder hacer zoom en el gráfico. También hay unas clases
Cursor que al pasear el ratón por encima del gráfico nos van diciendo las coordenadas del gráfico en las que estamos, aparte de permitir dejar unas marcas en el gráfico.
Ahora supongamos que vamos a hacer un programa matemático en el que tenemos una interface de usuario y en ella hay unos 200 gráficos. Todos ellos son de funciones matemáticas y queremos que tengan un aspecto similar. Todos pintarán una función matemática, llevarán una rejilla, unos botones de zoom y una mano que permita arrastrar el gráfico.
Para hacer cada uno de estos gráficos debemos hacer los siguientes pasos:
- Instanciar la clase Lienzo.
- Instanciar la clase EscalaGrafica que convierte coordenadas a pixels y meterla en la clase Lienzo.
- Instanciar la clase Rejilla y meterla en Lienzo.
- Instanciar la clase Mano y meterla en Lienzo.
- Instanciar los botones de zoom, pasarles la EscalaGrafica y ponerlos en un contenedor junto al Lienzo.
- Finalmente, el paso que es especifico de cada grafico, que es instanciar el ObjetoGrafico que representa la funcion matemática que queremos pintar y meterlo en el Lienzo.
Vemos que hay un montón de pasos que son comunes a todos los gráficos. Son comunes todos excepto el último, en el que la función será la que sea. También vemos que hay un pequeño berenjenal de clases e inicializaciones entre ellas.
El
patrón fachada nos dice que podemos hacer una clase que nos oculte toda esta complejidad. La clase puede ser
GraficoDeFuncion, que sea un contenedor (un
JPanel java) que dentro instancie el
Lienzo, la botonería de Zoom, la
Mano, la
EscalaGrafica y la
Rejilla. Lo inicialice y lo coloque todo en su sitio. Únicamente habría que pasarle desde fuera la función matemática que queramos y si acaso los valores extremos de coordenadas (de -PI a PI para x y de -1 a 1 para y si queremos pintar un
sin(x), por ejemplo).
De esta forma, en nuestra aplicación, iremos instanciando clases
GraficoDeFuncion que son más fáciles de inicilizar.
En resumen, el
patrón fachada consiste en crear una única clase de manejo más fácil que nos permita acceder a un conjunto más o menos numeroso y complicado de clases que necesitan una inicialización compleja. Quizás no nos deja hacer todo lo que se podría hacer con las clases sueltas (por ejemplo, no poner
Mano a un gráfico o ponerle una botonería de zoom distinta a las demás), pero nos ahorra mucho el trabajo de instanciación e inicialización de todo eso.