El facade pattern es la solución perfecta cuando se buscan es­tra­te­gias adecuadas para si­m­pli­fi­car un software complejo. Al igual que el patrón decorador o el patrón compuesto, pertenece a la categoría de patrones es­tru­c­tu­ra­les de los llamados patrones de diseño GoF (abre­via­tu­ra de “Gang of Four” o “Banda de los cuatro”), que han tenido una in­flue­n­cia decisiva en el diseño de software desde su pu­bli­ca­ción en 1994.

En este artículo, te ex­pli­ca­mos qué es el patrón fachada y cómo ayuda a los de­sa­rro­lla­do­res en el proceso de igualar los su­b­si­s­te­mas.

¿Qué es el facade pattern?

El patrón fachada es uno de los 23 design patterns de los GoF, que fueron pu­bli­ca­dos en 1994 por los autores Erich Gamma, Ralph Johnson, Richard Helm y John Vlissides en “Patrones de diseño: elementos de software orientado a objetos re­uti­li­za­ble” como guía para los de­sa­rro­lla­do­res de software. En general, estos patrones tienen como objetivo si­m­pli­fi­car la creación de software flexibles y re­uti­li­za­bles. El patrón fachada define una solución modelo para una fusión simple de di­fe­re­n­tes in­te­r­fa­ces en sistemas complejos. Una clase de fachada universal, que también funciona como interfaz, delega im­po­r­ta­n­tes fu­n­cio­na­li­da­des del software a los re­s­pe­c­ti­vos su­b­si­s­te­mas para que el manejo de los diversos su­b­co­m­po­ne­n­tes de un programa sea lo más sencillo posible.

¿Qué problemas soluciona el patrón fachada?

Los clientes que acceden a un su­b­si­s­te­ma complejo se refieren di­re­c­ta­me­n­te a un gran número de objetos con in­te­r­fa­ces co­m­ple­ta­me­n­te di­fe­re­n­tes o dependen de estos objetos. Esto hace que la im­ple­me­n­ta­ción, ada­p­ta­ción, prueba y re­uti­li­za­ción de los clientes sea pa­r­ti­cu­la­r­me­n­te difícil para los de­sa­rro­lla­do­res. Aquí es donde el facade pattern puede ser útil.

El patrón fachada define un objeto de fachada central que:

  • im­ple­me­n­ta una interfaz universal para las distintas in­te­r­fa­ces del su­b­si­s­te­ma o su­b­si­s­te­mas.
  • y (si es necesario) puede realizar funciones adi­cio­na­les antes o después de reenviar una solicitud al cliente.

Como in­te­r­me­dia­rio, el objeto de fachada garantiza que el acceso y la co­mu­ni­ca­ción con los co­m­po­ne­n­tes in­di­vi­dua­les de un su­b­si­s­te­ma se si­m­pli­fi­quen y se reduzca al mínimo la de­pe­n­de­n­cia directa de estos co­m­po­ne­n­tes. Este delega las llamadas de los clientes para que éstos no necesiten conocer las clases o sus re­la­cio­nes y de­pe­n­de­n­cias.

B1Y8fcYrz5o.jpg Para mostrar este video, se requieren cookies de terceros. Puede acceder y cambiar sus ajustes de cookies aquí.

Patrón fachada: re­pre­se­n­ta­ción en el diagrama de clase UML

La fachada o la clase de fachada es la unidad es­tru­c­tu­ra­do­ra decisiva del facade pattern. En otras palabras, su im­ple­me­n­ta­ción y pre­pa­ra­ción es la tarea fu­n­da­me­n­tal para los de­sa­rro­lla­do­res que buscan si­m­pli­fi­car su complejo software uti­li­za­n­do este práctico patrón de diseño. Una vez im­ple­me­n­ta­do, los objetos del cliente se comunican con la clase de fachada, que en este nuevo sistema es la única instancia de la que dependen di­re­c­ta­me­n­te los clientes.

El siguiente diagrama UML ilustra la in­ter­ac­ción de las clases de clientes, fachada y su­b­si­s­te­ma según el patrón fachada.

Facade pattern: ventajas y de­s­ve­n­ta­jas

Las ventajas del facade pattern son obvias: la fachada “oculta” los su­b­si­s­te­mas de software su­b­ya­ce­n­tes y, por lo tanto, reduce la co­m­ple­ji­dad de estos sistemas. Además, el enfoque promueve el principio de aco­pla­mie­n­to suelto. Debido al bajo grado de in­te­r­de­pe­n­de­n­cia de los co­m­po­ne­n­tes in­di­vi­dua­les, los cambios (mo­di­fi­ca­cio­nes, ma­n­te­ni­mie­n­to) son co­n­ve­nie­n­tes y posibles en cualquier momento. Es más, gracias al aco­pla­mie­n­to suelto, un su­b­si­s­te­ma es más fácil de expandir.

Nota

Si los clientes dependen del acceso directo a ciertas clases del su­b­si­s­te­ma, el acceso también puede ser otorgado en el modelo de patrón fachada. En este caso, sólo es necesario programar la vi­si­bi­li­dad del su­b­si­s­te­ma para que un cliente pueda evitar la fachada si es necesario.

Sin embargo, el uso del patrón fachada tiene algunas de­s­ve­n­ta­jas. Debido a su papel central, la im­ple­me­n­ta­ción de una fachada es una tarea tediosa y co­m­pli­ca­da, es­pe­cia­l­me­n­te si tiene que ser insertada en un código existente. En general, la in­s­ta­la­ción de una interfaz de fachada requiere una etapa adicional indirecta, que a su vez aumenta el tiempo de co­mpu­tación para las llamadas de método y función, el acceso a la memoria, etc. Por último, el patrón fachada también presenta el riesgo de que el software se vuelva demasiado de­pe­n­die­n­te de la interfaz maestra central.

Ventajas De­s­ve­n­ta­jas
Minimiza la co­m­ple­ji­dad de los su­b­si­s­te­mas Apli­ca­ción compleja (es­pe­cia­l­me­n­te en un código existente)
Promueve el principio de aco­pla­mie­n­to suelto La apro­xi­ma­ción está aco­m­pa­Ã±a­da por un nivel adicional de in­di­re­c­ción
El software se vuelve más flexible y fá­ci­l­me­n­te ex­pa­n­di­ble Alto grado de de­pe­n­de­n­cia en la interfaz de la fachada

Casos típicos de uso del facade pattern

Las pro­pie­da­des del facade pattern lo co­n­vie­r­ten en un patrón in­te­re­sa­n­te para varios ámbitos de apli­ca­ción. En primer lugar, existe el deseo de una interfaz uniforme para acceder a su­b­si­s­te­mas complejos o a cualquier número de objetos, y una fachada ayuda a si­m­pli­fi­car las cosas en este caso. Por esta razón, el uso de la es­tra­te­gia del patrón fachada desempeña un papel im­po­r­ta­n­te en la pla­ni­fi­ca­ción de un proyecto.

Otra apli­ca­ción típica es el software en el que la de­pe­n­de­n­cia entre los clientes y los su­b­si­s­te­mas su­b­ya­ce­n­tes debe reducirse al mínimo.

Por último, el patrón fachada es un enfoque útil para pla­ni­fi­car proyectos de software que tienen múltiples capas. Las fachadas actúan como in­te­r­fa­ces de co­mu­ni­ca­ción entre las distintas capas, au­me­n­ta­n­do la fle­xi­bi­li­dad y la po­si­bi­li­dad de am­plia­ción y ada­p­ta­ción de los co­m­po­ne­n­tes.

Ejemplo práctico de apli­ca­ción del facade pattern

El patrón fachada está conectado a lenguajes de pro­gra­ma­ción es­pe­cí­fi­cos. El patrón se usa tí­pi­ca­me­n­te con C++, C#, Ja­va­S­cri­pt, Java, PHP y Python. El siguiente ejemplo de patrón fachada está basado en Java y tomado de la página web de tu­to­ria­l­s­poi­nt.com.

En este ejemplo, se definirá una interfaz de apli­ca­ción universal “Shape” para los objetos que re­pre­se­n­tan una forma geo­mé­tri­ca. Además, se generan clases concretas que im­ple­me­n­tan la interfaz, así como clases de fachada llamadas “Sha­pe­Ma­ker”, que se encargan de delegar las consultas de los clientes.

En primer lugar, creamos la interfaz Shape.java usando el siguiente código:

public interface Shape {
	void draw();
}

En segundo lugar, se crean tres clases concretas que im­ple­me­n­tan la interfaz: Rectangle.java (clase para objetos re­c­ta­n­gu­la­res), Square.java (clase para objetos cuadrados) y Circle.java (clase para objetos redondos).

public class Rectangle implements Shape {
	@Override
	public void draw() {
		System.out.println("Rectangle::draw()");
	}
}
public class Square implements Shape {
	@Override
	public void draw() {
		System.out.println("Rectangle::draw()");
	}
}
public class Circle implements Shape {
	@Override
	public void draw() {
		System.out.println("Rectangle::draw()");
	}
}

Por último, la clase de fachada Sha­pe­Ma­ker se integra en el código que será llamado por los clientes para crear las di­fe­re­n­tes formas:

public class ShapeMaker {
	private Shape circle;
	private Shape rectangle;
	private Shape square;
	public ShapeMaker() {
		circle = new Circle();
		rectangle = new Rectangle();
		square = new Square();
	}
	public void drawCircle(){
		circle.draw();
	}
	public void drawRectangle(){
		rectangle.draw();
	}
	public void drawSquare(){
		square.draw();
	}
}
Ir al menú principal