Patrón de diseño de fachada en Java

Patrón de Diseño de Fachada es uno de los patrones de diseño estructurales (como el patrón Adaptador y el patrón Decorador). El patrón de diseño de fachada se utiliza para ayudar a las aplicaciones cliente a interactuar fácilmente con el sistema.

Patrón de Diseño de Fachada

Según GoF, el patrón de diseño de fachada es:

Proporcionar una interfaz unificada para un conjunto de interfaces en un subsistema. El patrón de fachada define una interfaz de nivel superior que facilita el uso del subsistema.

Supongamos que tenemos una aplicación con un conjunto de interfaces para utilizar la base de datos MySql/Oracle y generar diferentes tipos de informes, como informes HTML, informes PDF, etc. Así que tendremos un conjunto diferente de interfaces para trabajar con diferentes tipos de bases de datos. Ahora, una aplicación cliente puede utilizar estas interfaces para obtener la conexión de base de datos requerida y generar informes. Pero cuando la complejidad aumenta o los nombres de comportamiento de las interfaces son confusos, la aplicación cliente encontrará difícil gestionarlo. Entonces, podemos aplicar el patrón de diseño de fachada aquí y proporcionar una interfaz de envoltura encima de la interfaz existente para ayudar a la aplicación cliente.

Patrón de Diseño de Fachada – Conjunto de Interfaces

Podemos tener dos interfaces auxiliares, a saber, MySqlHelper y OracleHelper.

package com.journaldev.design.facade;

import java.sql.Connection;

public class MySqlHelper {
	
	public static Connection getMySqlDBConnection(){
		//obtener conexión a la base de datos MySql usando parámetros de conexión
		return null;
	}
	
	public void generateMySqlPDFReport(String tableName, Connection con){
		//obtener datos de la tabla y generar informe PDF
	}
	
	public void generateMySqlHTMLReport(String tableName, Connection con){
		//obtener datos de la tabla y generar informe PDF
	}
}
package com.journaldev.design.facade;

import java.sql.Connection;

public class OracleHelper {

	public static Connection getOracleDBConnection(){
		//obtener conexión a la base de datos Oracle usando parámetros de conexión
		return null;
	}
	
	public void generateOraclePDFReport(String tableName, Connection con){
		//obtener datos de la tabla y generar informe PDF
	}
	
	public void generateOracleHTMLReport(String tableName, Connection con){
		//obtener datos de la tabla y generar informe PDF
	}
	
}

Interfaz del Patrón de Diseño de Fachada

Podemos crear una interfaz de patrón de fachada como se muestra a continuación. Observe el uso de Java Enum para garantizar la seguridad del tipo.

package com.journaldev.design.facade;

import java.sql.Connection;

public class HelperFacade {

	public static void generateReport(DBTypes dbType, ReportTypes reportType, String tableName){
		Connection con = null;
		switch (dbType){
		case MYSQL: 
			con = MySqlHelper.getMySqlDBConnection();
			MySqlHelper mySqlHelper = new MySqlHelper();
			switch(reportType){
			case HTML:
				mySqlHelper.generateMySqlHTMLReport(tableName, con);
				break;
			case PDF:
				mySqlHelper.generateMySqlPDFReport(tableName, con);
				break;
			}
			break;
		case ORACLE: 
			con = OracleHelper.getOracleDBConnection();
			OracleHelper oracleHelper = new OracleHelper();
			switch(reportType){
			case HTML:
				oracleHelper.generateOracleHTMLReport(tableName, con);
				break;
			case PDF:
				oracleHelper.generateOraclePDFReport(tableName, con);
				break;
			}
			break;
		}
		
	}
	
	public static enum DBTypes{
		MYSQL,ORACLE;
	}
	
	public static enum ReportTypes{
		HTML,PDF;
	}
}

Programa Cliente del Patrón de Diseño de Fachada

Ahora veamos el código del cliente sin utilizar el patrón de fachada y utilizando la interfaz del patrón de fachada.

package com.journaldev.design.test;

import java.sql.Connection;

import com.journaldev.design.facade.HelperFacade;
import com.journaldev.design.facade.MySqlHelper;
import com.journaldev.design.facade.OracleHelper;

public class FacadePatternTest {

	public static void main(String[] args) {
		String tableName="Employee";
		
		//generando informe HTML de MySql e informe PDF de Oracle sin usar la fachada
		Connection con = MySqlHelper.getMySqlDBConnection();
		MySqlHelper mySqlHelper = new MySqlHelper();
		mySqlHelper.generateMySqlHTMLReport(tableName, con);
		
		Connection con1 = OracleHelper.getOracleDBConnection();
		OracleHelper oracleHelper = new OracleHelper();
		oracleHelper.generateOraclePDFReport(tableName, con1);
		
		//generando informe HTML de MySql e informe PDF de Oracle usando la fachada
		HelperFacade.generateReport(HelperFacade.DBTypes.MYSQL, HelperFacade.ReportTypes.HTML, tableName);
		HelperFacade.generateReport(HelperFacade.DBTypes.ORACLE, HelperFacade.ReportTypes.PDF, tableName);
	}

}

Como se puede ver, el uso de la interfaz del patrón de fachada es una forma mucho más fácil y limpia de evitar tener mucha lógica en el lado del cliente. La clase JDBC Driver Manager para obtener la conexión a la base de datos es un maravilloso ejemplo de patrón de diseño de fachada.

Puntos Importantes del Patrón de Diseño de Fachada

  • El patrón de diseño de fachada es más como un ayudante para las aplicaciones cliente, no oculta las interfaces del subsistema al cliente. Si utilizar o no la fachada depende completamente del código del cliente.
  • El patrón de diseño de fachada se puede aplicar en cualquier momento del desarrollo, generalmente cuando el número de interfaces crece y el sistema se vuelve complejo.
  • Las interfaces del subsistema no son conscientes de la fachada y no deben tener ninguna referencia de la interfaz de la fachada.
  • El patrón de diseño de fachada debe aplicarse para interfaces similares, su propósito es proporcionar una única interfaz en lugar de múltiples interfaces que realicen trabajos similares.
  • Podemos usar el patrón de fábrica con la fachada para proporcionar una mejor interfaz a los sistemas cliente.

Eso es todo para el patrón de diseño de fachada, ¡mantente atento para más artículos sobre patrones de diseño! 🙂

Source:
https://www.digitalocean.com/community/tutorials/facade-design-pattern-in-java