Fabrica Abstracta

1 Sinopsis

Provee una interfase para crear familias de objetos relacionados, sin tener que especificar su clase concreta

2 Contexto

Se necesita representar informacion sobre una computadora, compuesta de CPU, Memoria, Disco, Teclado y Monitor. Se desea que una clase cliente manipule instancias de las clases anteriores, ensamble la computadora. Sin embargo, se tiene que implantar cada clase, para que realice las funciones especificas. Se necesita proveer una clase que ayude a fabricar cada elemento de la computadora, entregando la representacion concreta, sin embargo el cliente debe manipularlo como interfases.

3 Solucion

El diagrama UML es el siguiente: AbstractFactory - declara una interface para operaciones que crean objetos abstractos de tipo producto. ConcreteFactory1, ConcreteFactory2 - implementa la interfase AbstractFactory creando productos concretos AbstractProductA, AbstractProductB - interfase que declara las operaciones de un producto ProductA1, ProductA2,ProductB1,ProductB2 - clase que implementa las interfase ProductA y ProductB respectivamente

4 Consecuencias

Es posible aislar en una sola clase, la construccion de objetos del mismo tipo, relacionados entre si. Se pueden crear distintas fabricas, que combinen los distintos objetos y sin necesidad de cambiar el codigo del cliente.

5 Ejemplo

Se declaran dos interfaces, CPU y DiscoDuro


public interface CPU  {
    ....
}
See the complete code for CPU here.
 public void procesa();

public interface DiscoDuro  {
    ....
}
See the complete code for DiscoDuro here.
 public void almacena();

Y las clase que implementan las dos interfases


public class Intel implements CPU  {
    ....
}
See the complete code for Intel here.
 public void procesa(){ System.out.println("Intel"); }

public class SPARC implements CPU  {
    ....
}
See the complete code for SPARC here.
 public void procesa(){ System.out.println("SPARC"); }

public class Seagate implements DiscoDuro  {
    ....
}
See the complete code for Seagate here.
 public void almacena(){ System.out.println("Seagate"); }

public class Veritas implements DiscoDuro  {
    ....
}
See the complete code for Veritas here.
 public void almacena(){ System.out.println("Veritas"); }

Las interfase que define una fabrica abstracta para un CPU y DiscoDuro


public interface HardwareFactoryIF  {
    ....
}
See the complete code for HardwareFactoryIF here.
public final static IntelFactory INTEL = new IntelFactory();
public final static SUNFactory SUN = new SUNFactory();
public CPU createCPU();
public DiscoDuro createDiscoDuro();

Y las clases que implantan la fabrica para el hardware


public class IntelFactory implements HardwareFactoryIF  {
    ....
}
See the complete code for IntelFactory here.
public CPU createCPU() { return new Intel(); }
public DiscoDuro createDiscoDuro() { return new Seagate(); }

public class SUNFactory implements HardwareFactoryIF  {
    ....
}
See the complete code for SUNFactory here.
public CPU createCPU() { return new SPARC(); }
public DiscoDuro createDiscoDuro() { return new Veritas(); }

La clase cliente utiliza las fabricas, como si fueran de tipo HardwareFactoryIF y pueden crear el hardware especifico.


public class ClienteFactory  {
    ....
}
See the complete code for ClienteFactory here.
public static void main(String [] args) {
   HardwareFactoryIF fabrica =HardwareFactoryIF.INTEL;
   CPU procesador = fabrica.createCPU();
   DiscoDuro disco = fabrica.createDiscoDuro();
   procesador.procesa();
   disco.almacena();
}