Patrón de Diseño Abstract Factory (Implementación en Java)

Abstract Factory es un patrón de diseño creacional, que te permite producir familias de objetos relaciondos con sus clases concretas. Para hacer más simple la explicación tomaremos el siguiente ejemplo.

Problema

Imagia que estás creando un simulador de una tienda de muebles. Tú código consiste en las clases que representan lo siguiente:

  1. Una familia de productos relacionados tal como: Chair + Sofa + CoffeTable.
  2. La colleción de objetos puede tener varias combinaciones, por ejemplo: Chair + Sofa + CoffeTable que estan disponibles en sus diferentes variaciones: Modern, Victorian, ArcDeco.

Vale, tú necesitas una forma de crear los objetos muebles individuales de tal forma que sea posible agruprarce con los otros objetos de su misma familia, a razón es porque los clientes se enojan cuando no reciben una agrupacion de muebles cuando lo requieren.

Considerando que tu no quieres cambiar el código existente cada que se anñaden nuevos productos o familia de productos al programa y por su puesto esto no es para nada una buena práctica. Los vendedores de la muebleria actualizan los catalogos con mucha frecuencia y tu no debes hacer cambios al código cada vez que se esto sucede.

Solución

Lo primero que el patrón Abstract Factory sugiere es que explicitamente las interfaces se declaren por cada producto distinto de la familia del producto. Después puedes hacer las variantes de los productos siguiendo estás interfaces. Por ejemplo, todas las variantes que pueden implementar la interface Chair

En el siguiente diagrama podrás ver la interfaz Abstract Factory, una interfaz con una lista de metodos para todos los productos que son parte de la familia de productos. Estos metodos regresan un tipo de producto abstracto representado por las interfaces que se han mostrado previamente: Chair, Sofa, etc.

Por cada variante de una familia de productos, creamos una clase fabrica separada basada en la interfaz AbstractFactory. Una Fabrica es una clase que regresa productos de un tipo particular. por ejemplo, MuebleriamodernaFactory puede crear objetos de tipo ModernChair, ModernSofa y ModernCoffeeTable.

Estructura base

  1. Abstract Products declara interfaces para un conjunto de productos distintos pero relacionados cada cual con su familia.
  2. Concrete Products: son varias implementaciones de productos abstractos, agrupados por variantes. Cada producto abstracto debe ser implementado en todas las variantes dadas (Victorian/Modern).
  3. Abstract Factory: Interfaz que declara un conjunto de métodos para crear cada uno de los productos abstractos.
  4. Concrete Factories: Implementa la creación de métodos de abstract factory. Cada fabrica concreta corresponde a una variante especifica de productos y crea solo esas variantes de productos.

Ejemplo

Podrás encontrar un ejemplo en Java en el siguiente repositorio GITHUB

Aplicaciones

  1. Usa la Abstract Factory cuando tú código necesite trabajar con varias falimias de productos, pero no quieras que dependa de las clases concretas de estos productos, puedes ser desconocidos de antemano o simplemente permitir extendibilidad furura.

Avatar de Rolando Castillo

Escrito por:

Deja un comentario