Imagina un sistema lleno de clases necesarias para realizar una determinada acción. Pongamos por ejemplo que queremos encender un ordenador, y tuvieramos que hacerlo de forma manual, llamando al POST, encendiendo el sistema de ventilacion, cargando el OS en la RAM, etc. ¿Sería un engorro verdad? Pues el botón que pulsamos y que desencadena una serie de procesos por nosotros es el patrón Facade. Nosotros no tenemos ni la menor idea de qué pasa dentro de la computadora, pero funciona simplificando los pasos que necesitamos, y si tenemos los conocimientos necesitarios incluso podemos refinar su proceso, es decir, no se nos veta el acceso a los componentes de los que la fachada nos abstrae.

Como siempre veamos un diagrama UML de las clases con las que vamos a ejemplificar el patrón.

 patron facade uml

Sobra decir que el anterior diagrama se ha hecho complejo a propósito, evitando desacoplamientos, etc para comprender mejor las ventajas de la fachada que provee el patrón.

Este diagrama con dependencias entre sí y sin un orden de carga definido es dificil de manejar y entender. Si quisieramos emular el comportamiento correcto del arranque de este sistema en un main() tendríamos algo similar a esto:

Desde luego, nada facil de leer, y con muchisimas dependencias. El patrón Facade nos permitirá generar una clase que llamando al menos numero de métodos posibles, automatice todo este código, abstrayendo al usuario del funcionamiento del programa y en este caso, evitando que se equivoque en el orden de ejecución, como podría ser administrar la corriente después de ejecutar el POST.

Si nos fijamos en el diagrama UML anterior vemos que pueden existir clases como FirmwareMotherboard que con su método ejecutarPOST() se encargan de abstraer la verificación y encendido de componentes como la Ram o los ventiladores(¡ya tenemos un ejemplo pequeño del patrón!), pero aun así, se nos queda corto para abstraer el encendido total del ordenador, necesitamos una fachada para todo el conjunto de clases y no solo para el encendido de algunos componentes. Algo en codigo similar a esto:

Y representado en UML así:

patron facade uml

Hemos conseguido encender el ordenador pero el cliente no ha necesitado conocer los entresijos de su lógica, simplemente ha llamado al método encenderOrdenador() de la clase TurnOnOffComputerFacade. ¡Y ojo! ¡Como hemos dicho no es la unica fachada del ejemplo!

En esencia el patrón Facade sirve para encapsular llamadas a métodos de distintas clases desde una clase que las contiene a todas y abstrae al usuario de su manejo.

Sin embargo este patrón puede tener una contrapartida con el que hay que tener cuidado: el no seguimiento del Principio de Mínimo Conocimiento.