Define una interfaz para la creación de familias de objetos
relacionados sin especificar sus clases concretas.
Aplicabilidad:
Estructura:
Participantes:
- Un sistema debe ser independiente de la forma en que sus productos son creados, compuestos y representados.
- Un sistema debe ser configurado con una de muchas familias de productos disponibles.
- Una familia de productos son diseñados para su uso conjunto, y se requiere asegurar este uso conjunto.
- Se desea proporcionar una biblioteca de productos presentando su interfaz, pero no su implementación
En la siguiente imagen podemos ver un diagrama UML de este patrón:
Participantes:
- Fábrica abstracta (IFabrica): Declara la interfaz para las operaciones que crean productos abstractos (métodos de fabricación)
- Fábrica concreta (Fabrica1, Fabrica2): Implementa los métodos de fabricación de productos concretos.
- Producto abstracto (IProductoA, IProductoB): Declara la interfaz utilizada por el cliente para un tipo de producto concreto.
- Producto concreto (ProductoA1, ProductoA2, ProductoB1, ProductoB2): Define un producto creado por el método de fabricación de una fábrica concreta. Implementa la interfaz del producto abstracto.
- Cliente: Usa sólo las interfaces declaradas por la fábrica abstracta y los productos abstractos.
Colaboraciones:
Normalmente se crea una única fábrica concreta que se
encarga de crear los productos concretos, mientras que la fábrica abstracta
difiere la creación de productos a sus subclases.
Concecuencias:
- Aísla clases concretas (No aparecen en el código del cliente).
- Facilita el intercambio de familias de productos.
- Simplifica la consistencia entre productos.
- Difícil de añadir nuevas clases de productos.
Implementación:
- Las fábricas usualmente suelen se instancias únicas.
- La creación de productos puede realizarse por el método de fabricación habitual o mediante el patrón prototipo para evitar extender la fábrica abstracta.
- Flexibilizar la fábrica mediante la parametrización del método de fabricación:
- El método de fabricación puede crear diferentes tipos de componentes en base a los parámetros del método.
- El cliente debe realizar una conversión tras crear el producto (downcasting).
- En la mayoría de los lenguajes no hay ninguna relación formal entre valores de los parámetros y productos creados, exceptuando el código fuente.
Patrones relacionados:
- Factory Method o Prototype: El patrón Factory Abstract suele implementarse con métodos de fabricación, de la misma forma, puede implementarse con el patrón Prototype.
- Singleton: Generalmente una fábrica concreta suele ser un Singleton.