Se encuentra en:
Factoría
RECU-0190 (Recurso Patrón)
- Área: Otras Especificaciones de Codificación de Aplicaciones Java
- Carácter del recurso: Recomendado
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
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
- Factoría Abstracta: Suele implementarse con metodos Factoría
- Plantilla: los métodos fábrica suelen invocarse desde métodos plantilla
Contenidos relacionados
Recursos
Código | Título | Tipo | Carácter |
---|---|---|---|
RECU-0191 | Factoría Abstracta | Patrón | Recomendado |
RECU-0198 | Plantilla | Patrón | Recomendado |