Builder

1 Sinopsis

Separa la construccion de un objeto complejo de su representacion de tal manera que el mismo proceso de construccion puede crear diferentes representaciones.

2 Contexto

Un sistema de edicion de texto, debe dar la capacidad de leer su formato y proveer de distintos convertidores a otros formatos (por ejemplo a HTML, CSV, XML). Dado que los formato posibles son variables con el tiempo, se debe construir un patron de disenno que permita agregar nuevos convertidores de formatos.

3 Solucion

4 Consecuencias

Permite crear distintas representaciones de un objeto

5 Ejemplo

Supongase una Accion Financiera, que tiene una empresa emisora, un identificador de la serie, un precio. Se necesita representar la informacion del objeto en formato CSV, HTML y XML


public class AccionFinanciera  {
    ....
}
See the complete code for AccionFinanciera here.
public String empresa;
public String serie;
public double precio;
public String convertir(AccionBuilder builder) {
 builder.buildEmpresa(empresa);
 builder.buildSerie(serie);
 builder.buildPrecio(precio);
 return builder.getAccion();
}

La interfase que define a AccionBuilder es:


public interface AccionBuilder  {
    ....
}
See the complete code for AccionBuilder here.
public void buildEmpresa(String emp);
public void buildSerie(String serie);
public void buildPrecio(double pr);
public String getAccion();

Y para construir una representacion CSV


public class CSVAccion implements AccionBuilder  {
    ....
}
See the complete code for CSVAccion here.
private String csv="";
public void buildEmpresa(String emp){ csv+=emp+",";}
public void buildSerie(String serie){ csv+=serie+",";}
public void buildPrecio(double pr){ csv+=pr;}
public  String getAccion(){ return csv;}

Y para construir una representacion XML


public class XMLAccion implements AccionBuilder  {
    ....
}
See the complete code for XMLAccion here.
private String xml="<accion >";
public void buildEmpresa(String emp){ xml+="<emision >"+emp+"</emision >";}
public void buildSerie(String serie){ xml+="<serie >"+serie+"</serie>";}
public void buildPrecio(double pr){ xml+="<precio>"+pr+"</precio>";}
public  String getAccion(){ return xml + "</accion>";}

El cliente solo debe decidir que Builder tomar


public class ClienteBuilder  {
    ....
}
See the complete code for ClienteBuilder here.
public static void main(String [] args) {
  AccionFinanciera acc= new AccionFinanciera();
  acc.empresa = "TELMEX"; acc.serie="A"; acc.precio=50.99;
  CSVAccion csv = new CSVAccion();
  System.out.println(acc.convertir(csv));
  XMLAccion xml = new XMLAccion();
  System.out.println(acc.convertir(xml));
}