Patrones de Diseño - Patron Abstract Factory - ¿Que es el Patrón de Diseño Abstract Factory / Fabrica Virtual?

Hola, como en estos últimos artículos hoy vamos hablar también de patrones de diseño pero vamos a ver el ultimo creación el Abstract Factory.

Patrones de Diseño -  ¿Que es el Patrón de Diseño Abstract Factory / Fabrica Virtual?

El patrón Abstract Factory está aconsejado cuando se prevé la inclusión de nuevas familias de productos, pero puede resultar contraproducente cuando se añaden nuevos productos o cambian los existentes, puesto que afectaría a todas las familias creadas.

Proporcionar una interfaz para crear familias de objetos relacionados o dependientes sin especificar sus clases concretas.

La diferencia entre el patrón Abstract Factory y el Factory Method radica en que mientras el Factory Method tiene por objetivo diferir hacia una determinada clase (o subclase) el tipo de producto a instanciar, el patrón Abstract Factory persigue garantizar la creación de un conjunto de productos relacionados.

Diagrama UML

Patrones de Diseño - Patron Abstract Factory - ¿Que es el Patrón de Diseño Abstract Factory / Fabrica Virtual?

Nota: El diagrama formal tiene un forma horrible, de esta manera se van a recordar mas ya que hace la forma de la "cabeza de gato".


Cliente: La clase que llamará a la factoría adecuada ya que necesita crear uno de los objetos que provee la factoría, es decir, Cliente lo que quiere es obtener una instancia de alguno de los productos (ProductoA, ProductoB).
AbstractFactory: Es la definición de la interfaces de las factorías. Debe de proveer un método para la obtención de cada objeto que pueda crear. ("crearProductoA()" y "crearProductoB()")
Factorías Concretas: Estas son las diferentes familias de productos. Provee de la instancia concreta de la que se encarga de crear. De esta forma podemos tener una factoría que cree los elementos gráficos para Windows y otra que los cree para Linux, pudiendo poner fácilmente (creando una nueva) otra que los cree para MacOS, por ejemplo.
Producto abstracto: Definición de las interfaces para la familia de productos genéricos. En el diagrama son "ProductoA" y "ProductoB". En un ejemplo de interfaces gráficas podrían ser todos los elementos: Botón, Ventana, Cuadro de Texto, Combo... El cliente trabajará directamente sobre esta interfaz, que será implementada por los diferentes productos concretos.

Producto concreto: Implementación de los diferentes productos. Podría ser por ejemplo "BotónWindows" y "BotónLinux". Como ambos implementan "Botón" el cliente no sabrá si está en Windows o Linux, puesto que trabajará directamente sobre la superclase o interfaz.

Nombre del patrón:
Abstract Factory / Fabrica Virtual

Clasificación del Patrón:
Creacional

Intención:

El problema que intenta solucionar este patrón es el de crear diferentes familias de objetos.


Ejemplo:

IProducto
package ar.com.patronesdisenio.abstractfactory.producto;
/**
* @author nconde
*/
public interface IProducto {

int getPrecio();
String getDescripcion();
}


EmpanadaCarne
package ar.com.patronesdisenio.abstractfactory.producto;
public class EmpanadaCarne implements IProducto{

@Override
public int getPrecio() {
return 15;
}

@Override
public String getDescripcion() {
return getClass().getName();
}
}


PizzaFugazzeta
package ar.com.patronesdisenio.abstractfactory.producto;
public class PizzaFugazzeta implements IProducto{

@Override
public int getPrecio() {
return 10;
}

@Override
public String getDescripcion() {
return getClass().getName();
}
}


CreadorFactory
package ar.com.patronesdisenio.abstractfactory.base;
import ar.com.patronesdisenio.abstractfactory.producto.IProducto;

public interface CreadorFactory {

IProducto crearProducto();
}


ProductoFactory
package ar.com.patronesdisenio.abstractfactory.base;
import ar.com.patronesdisenio.abstractfactory.producto.IProducto;
public class ProductoFactory {

public static void crearProducto(CreadorFactory pf){
IProducto producto = pf.crearProducto();
System.out.println("Creando: " + producto.getClass().getName());
}
}


PizzaFactory
package ar.com.patronesdisenio.abstractfactory.base;
import ar.com.patronesdisenio.abstractfactory.producto.IProducto;
import ar.com.patronesdisenio.abstractfactory.producto.PizzaFugazzeta;

public class PizzaFactory implements CreadorFactory {

@Override
public IProducto crearProducto() {
PizzaFugazzeta pf = new PizzaFugazzeta();
return pf;
}
}


EmpanadaFactory
package ar.com.patronesdisenio.abstractfactory.base;
import ar.com.patronesdisenio.abstractfactory.producto.EmpanadaCarne;
import ar.com.patronesdisenio.abstractfactory.producto.IProducto;

public class EmpanadaFactory implements CreadorFactory {

@Override
public IProducto crearProducto() {
EmpanadaCarne pf = new EmpanadaCarne();
return pf;
}
}


Main
package ar.com.patronesdisenio.abstractfactory.base;
public class Main {

public static void main(String[] args) {
PizzaFactory pf = new PizzaFactory();
ProductoFactory.crearProducto(pf);
}
}


Patrones de Diseño - Patron Abstract Factory - ¿Que es el Patrón de Diseño Abstract Factory / Fabrica Virtual? Patrones de Diseño - Patron Abstract Factory - ¿Que es el Patrón de Diseño Abstract Factory / Fabrica Virtual? Reviewed by El lado oscuro de java on noviembre 11, 2014 Rating: 5

1 comentario:

  1. Hola, esta muy bueno el aporte, sólo una pregunta, ProductoFactory en el diagrama de clases cual es¿? podrías subir si no es mucha molestia el diagrama de clases de este ejemplo de JAVA que has diseñado¿? gracias.

    ResponderEliminar

Con la tecnología de Blogger.