Factoría

RECU-0190 (Recurso Patrón)

Descripción

Centraliza en una clase constructora la creación de objetos de un subtipo de un tipo determinado, ocultando al usuario la casuística para elegir el subtipo que crear.

Nombre

También conocido como Constructor Virtual

Clasificación

Patrón creacional

Motivación

Si pensamos en un Framework, rápidamente identificamos que usa clases abstractas para la definición y mantenimiento de las relaciones entre objetos. A menudo es responsable de la creación de esos objetos. Pensemos en el ejemplo de un Framework para aplicaciones que pueden presentar multitud de documentación al usuario. Un aplicación no pudee preveer que tipo de documentación necesita.

He aqui el dilema el framework tiene que incializar clases pero solo conoce las clases abstractas. El patrón Fatoría encapsula este conocimiento y lo saca fuera del Framework , permitiendo que mediante nuevas clases podamos identificar cual es el documento asociado.

Aplicabildidad

Es recomendable el uso de este patrón si:

  • Una clase de objetos no puede prever la clase de objetos que tiene que crear
  • Las subclases son los que especifiquen los objetos que se crean
  • Las clases delegan la responsabilidad en una entre varias clases auxilariares

Estructura

La representación del patrón es la siguiente:

176

Participantes

  • Producto: Define la interfaz de los objetos que la Factoría crea.
  • ProductoConcreto: Define la interfaz del Producto
  • Creador: Declara el método factoría que devuelve un objeto de tipo Producto
  • CreadorConcreto: Sobreescribe el método Factoría para que devuelva un ProductoConcreto

Colaboraciones

El Creador busca entre las subclases y devuelve una instancia apropiada de ProdcutoConcreto

Consecuencias

Los métodos Factoría eliminan la necesidad de ligar clases específicas de la aplicación a nuestro código. Dos consecuencias a tener en cuenta son:

  • Proporciona enganches para las subclases
  • Conexión jerarquica de clases paralelas

Implementación

Para hacer una buena implementación del patrón hay que considerar:

  • Dos variantes principales. El caso en que la clase Creador sea abstracta y no provea de una implementación del metodo Factoria o en el caso de que la clase Creador sea una clase Concreta y provea de una implementación del método Factoría
  • Metodos Factoría parametrizados
  • Variantes y cuestiones específicas del lenguaje
  • Uso de plantillas para evitar la herencia
  • Convenciones de nombre: Se suele usar el prefijo Create

Código de ejemplo

// Definimos la clase abstracta constructora
public abstract class Creador{
    // Operación que realiza
    public Producto  operacion() {
        Producto productoA = factoria();
        return productoA;
    }
 
    // Definimos método abstracto
    protected abstract Producto factoria();
}

Ahora definimos el creador concreto.

public class CreadorConcreto extends Creador{
    protected Producto factoria() {
        return new ProductoConcreto();
    }
}

Y definimos el producto y su implementación concreta.

public interface Producto{}
 
public class  ProductoConcreto implements Producto{}

Y un ejemplo de uso :

public static void main(String args[]){
    Creador creadorA;
    creadorA = new CreadorConcreto();
    creadorA.operacion();
}

Usos conocidos

  • Frameworks
  • JDK. Clase URLConnection
  • Creación de Proxies en middlewares

Patrones Relacionados

Contenidos relacionados

Recursos
Área: Desarrollo » Aplicaciones Java » Otras Especificaciones de Codificación de Aplicaciones Java
Código Título Tipo Carácter
RECU-0191 Factoría Abstracta Patrón Recomendado
RECU-0198 Plantilla Patrón Recomendado