Quizá uno de los temas que para muchas personas es más complejo a la hora de desarrollar aplicaciones es el uso de patrones de diseño. Los patrones de diseño son soluciones de ingeniería de software a problemas recurrentes en el mundo del desarrollo. Cuando aparece el problema X se suele solventar con el patrón de diseño Y. Hoy voy a cubrir en este artículo uno de los patrones más sencillos: el patrón fachada.
Uso de fachadas
¿Qué es una fachada o facade en inglés?. Es un patrón de diseño que nos permite simplificar el interface de comunicación entre dos objetos A y B de tal forma que para el objeto A sea más sencillo interactuar con el objeto B. Supongamos que tenemos las siguientes clases:

Vamos a ver el código de Impresora (Java):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | package com.genbetadev; public class Impresora { private String tipoDocumento; private String hoja; private boolean color; private String texto; public String getTipoDocumento() { return tipoDocumento; } public void setTipoDocumento(String tipoDocumento) { this .tipoDocumento = tipoDocumento; } public String getHoja() { return hoja; } public void setHoja(String hoja) { this .hoja = hoja; } public boolean isColor() { return color; } public void setColor( boolean color) { this .color = color; } public String getTexto() { return texto; } public void setTexto(String texto) { this .texto = texto; } public void imprimirDocumento() { System.out.println( "imprimiendo:" + texto+ ",color:" + color+ ",tipo:" +tipoDocumento+ ",hoja :" +hoja); } } |
Se trata de una clase sencilla que imprime documentos en uno u otro formato. El código de la clase cliente nos ayudará a entender mejor su funcionamiento.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | package com.genbetadev; public class PrincipalCliente { public static void main(String[] args) { Impresora i = new Impresora(); i.setHoja( "a4" ); i.setColor( true ); i.setTipoDocumento( "pdf" ); i.setTexto( "texto 1" ); i.imprimirDocumento(); Impresora i2 = new Impresora(); i2.setHoja( "a4" ); i2.setColor( true ); i2.setTipoDocumento( "pdf" ); i2.setTexto( "texto 2" ); i2.imprimirDocumento(); Impresora i3 = new Impresora(); i3.setHoja( "a3" ); i3.setColor( false ); i3.setTipoDocumento( "excel" ); i3.setTexto( "texto 3" ); i3.imprimirDocumento(); } } |
Como podemos ver la clase cliente se encarga de invocar a la impresora, y configurarla para después imprimir varios documentos .Ahora bien prácticamente todos los documentos que escribimos tienen la misma estructura (formato A4, Color , PDF). Estamos continuamente repitiendo código. Vamos a construir una nueva clase FachadaImpresoraNormal que simplifique la impresión de documentos que sean los más habituales.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | package com.genbetadev; public class FachadaImpresoraNormal { Impresora impresora; public FachadaImpresoraNormal(String texto) { super (); impresora= new Impresora(); impresora.setColor( true ); impresora.setHoja( "A4" ); impresora.setTipoDocumento( "PDF" ); impresora.setTexto(texto); } public void imprimir() { impresora.imprimirDocumento(); } } |
De esta forma el cliente quedará mucho más sencillo :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | package com.genbetadev; public class PrincipalCliente2 { public static void main(String[] args) { FachadaImpresoraNormal fachada1= new FachadaImpresoraNormal( "texto1" ); fachada1.imprimir(); FachadaImpresoraNormal fachada2= new FachadaImpresoraNormal( "texto2" ); fachada2.imprimir(); Impresora i3 = new Impresora(); i3.setHoja( "a4" ); i3.setColor( true ); i3.setTipoDocumento( "excel" ); i3.setTexto( "texto 3" ); i3.imprimirDocumento(); } } |
Diseño de patrones e inmutabilidad
Una de las ventajas que tienen los patrones de diseño es su INMUTABILIDAD ya que no cambian aunque cambiemos de lenguaje de programación. Lo creamos o no en muchos casos nos rodean en la programación del día a día. Por ejemplo muchas veces la gente me pregunta ¿Qué es mejor cuando realizamos una petición ajax con JQuery? ¿Usar $.ajax() o usar $.get(), $.post()? .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | var peticion = $.ajax( "destino.php" ).done( function () { alert( "ok" ); }) var peticion2 = $.get( "destino.php" , function () { alert( "ok" ); }); var peticion3 = $.post( "destino.php" , function () { alert( "ok" ); }); |
Rapidamente aparecen dudas .¿Por qué JQuery tiene métodos tan similares?. Revisando los patrones de diseño podremos ver que $.get() y $.post() son fachadas sobre $.ajax() y que este admite muchos tipos de configuraciones.

En Genbeta Dev | Android Patterns: patrones de diseño para desarrollar aplicaciones Android, Los patrones de diseño de software