En un post anterior habíamos recalcado la importancia del uso de patrones de diseño en el proceso de desarrollo de software.
En este artículo vamos a explicar el patrón de diseño Factory, el cual dicho sea de paso es uno de los más usados en desarrollos con Java.
Patrón de diseño Fábrica
El patrón de diseño Factory o el patrón de diseño de método de fábrica es uno de los patrones de diseño más utilizados en Java.
Según GoF, este patrón «define una interfaz para crear un objeto, pero deja que las subclases decidan qué clase instanciar. El método Factory permite que una clase difiera la instanciación a subclases».
Este patrón delega la responsabilidad de inicializar una clase desde el cliente a una clase de fábrica particular mediante la creación de un tipo de constructor virtual.
Para lograr esto, confiamos en una fábrica que nos proporciona los objetos, ocultando los detalles de implementación reales. Se accede a los objetos creados utilizando una interfaz común.
Ejemplo practico
En este ejemplo, crearemos una interfaz de Conexión que será implementada por varias clases concretas. Se usará ConexionFactory para buscar objetos de esta familia:
Primero creamos la interfaz de conexión, Iconexion:
public interface IConexion { void conectar(); void desconectar(); }
A continuación, crearemos algunas implementaciones de conexión como ConexionSQL, ConexionPostgreSQL, etc. que implementan esta interfaz y devuelven un objeto de tipo Conexion.
package com.rootnite.training.design_pattern.factory.Implements; import com.rootnite.training.design_pattern.factory.Interface.IConexion; /** * * @author Edy Huiza */ public class ConexionPostgreSQL implements IConexion { private String host; private String puerto; private String usuario; private String contrasena; public ConexionPostgreSQL() { this.host = "localhost"; this.puerto = "5433"; this.usuario = "postgres"; this.contrasena = "123"; } public void conectar() { // Aqui puede ir código JDBC System.out.println("Se conectó a PostgreSQL"); } public void desconectar() { System.out.println("Se desconectó de PostgreSQL"); } @Override public String toString() { return "ConexionPostgreSQL [host=" + host + ", puerto=" + puerto + ", usuario=" + usuario + ", contrasena=" + contrasena + "]"; } }
Ahora podemos crear una fábrica que obtenga la conexión para una base de datos y devuelva la implementación apropiada de esta interfaz:
Observe cómo el cliente puede confiar en esta fábrica para proporcionarse de una conexión a base de datos apropiado, sin tener que inicializar el objeto directamente.
Cuando usar este patrón de diseño
- Cuando se espera que la implementación de una interfaz o una clase abstracta cambie con frecuencia
- Cuando la implementación actual no puede acomodar cómodamente un nuevo cambio
- Cuando el proceso de inicialización es relativamente simple, y el constructor solo requiere un puñado de parámetros
Si deseas el codigo fuente del ejemplo el mismo esta publicado en github, y lo encuentras en el siguiente link.
https://github.com/rootnite/java-design-patterns/tree/master/Factory