informaticaPC

Patrones de Diseño Software


Regístrate

Tus datos no serán compartidos, solo nosotros te enviaremos información y novedades

Builder

Este patrón puede ser utilizado cuando necesitemos crear objetos complejos compuestos de varias partes independientes.

Patrón Builder en UML

A continuación mostramos un ejemplo en el que utilizamos este patrón de diseño para construir diferentes tipos de objetos Coche(), con un determinado equipamiento de serie cada uno de ellos (básico, medio y full equip):

Main.java:

package Builder01;

public class Main
{
    public static void main(String[] args)
    {
        // Crear el objeto Director
        Director objFabrica = new Director();

        // Crear los objetos ConcreteBuilder
        BuilderCoche base  = new ConstructorCocheBase();
        BuilderCoche medio = new ConstructorCocheMedio();
        BuilderCoche full  = new ConstructorCocheFull();

        // Construir un coche con equipamiento base
        objFabrica.construir( base );
        Coche cocheBase = base.getCoche();

        // Construir un coche con equipamiento medio
        objFabrica.construir( medio );
        Coche cocheMedio = medio.getCoche();

        // Construir un coche con equipamiento full
        objFabrica.construir( full );
        Coche cocheFull = full.getCoche();

        // Mostrar la información de cada coche creado
        mostrarCaracteristicas( cocheBase );
        mostrarCaracteristicas( cocheMedio );
        mostrarCaracteristicas( cocheFull );
    }

    // --------------------------------

    public static void mostrarCaracteristicas( Coche coche )
    {
        System.out.println( "Motor: " + coche.getMotor() );
        System.out.println( "Carrocería: " + coche.getCarroceria() );
        System.out.println( "Elevalunas eléctrico: " + coche.getElevalunasElec() );
        System.out.println( "Airea acondicionado: " + coche.getAireAcond() );

        System.out.println("===================================");
    }
}

Director.java:

package Builder01;

public class Director
{

    public Director() {
    }

    // --------------------------

    public void construir( BuilderCoche builder )
    {
        builder.crearNuevoCoche();

        builder.construirMotor();
        builder.construirCarroceria();
        builder.construirElevalunas();
        builder.construirAireAcond();
    }
}

BuilderCoche.java (un Builder en el diagrama anterior):

package Builder01;

public abstract class BuilderCoche
{
    protected Coche coche;

    // ------------------------------

    public Coche getCoche() {
        return this.coche;
    }

    // ------------------------------

    public void crearNuevoCoche() {
        this.coche = new Coche();
    }

    // ------------------------------------

    // Métodos que deberán ser construídos por las clases que hereden de ésta
    public abstract void construirMotor();
    public abstract void construirCarroceria();
    public abstract void construirAireAcond();
    public abstract void construirElevalunas();
}

ConstructorCocheBase.java (un ConcreteBuilder en el diagrama anterior):

package Builder01;

public class ConstructorCocheBase extends BuilderCoche
{
    public ConstructorCocheBase() {
    }

    // ------------------------------

    @Override
    public void construirMotor() {
        this.coche.setMotor( "Motor de potencia mínima" );
    }

    // ------------------------------

    @Override
    public void construirCarroceria() {
        this.coche.setCarroceria( "Carrocería de baja protección" );
    }

    // ------------------------------

    @Override
    public void construirAireAcond() {
        this.coche.setAireAcond( false );
    }

    // ------------------------------

    @Override
    public void construirElevalunas() {
        this.coche.setElevalunasElec( false );
    }
}

ConstructorCocheMedio.java (un ConcreteBuilder en el diagrama anterior):

package Builder01;

public class ConstructorCocheMedio extends BuilderCoche
{
    public ConstructorCocheMedio() {
    }

    // ------------------------------

    @Override
    public void construirMotor() {
        this.coche.setMotor( "Motor de potencia media" );
    }

    // ------------------------------

    @Override
    public void construirCarroceria() {
        this.coche.setCarroceria( "Carrocería de protección media" );
    }

    // ------------------------------

    @Override
    public void construirAireAcond() {
        this.coche.setAireAcond( false );
    }

    // ------------------------------

    @Override
    public void construirElevalunas() {
        this.coche.setElevalunasElec( true );
    }
}

ConstructorCocheFull.java (un ConcreteBuilder en el diagrama anterior):

package Builder01;

public class ConstructorCocheFull extends BuilderCoche
{
    public ConstructorCocheFull() {
    }

    // ------------------------------

    @Override
    public void construirMotor() {
        this.coche.setMotor( "Motor de potencia alta" );
    }

    // ------------------------------

    @Override
    public void construirCarroceria() {
        this.coche.setCarroceria( "Carrocería de alta protección" );
    }

    // ------------------------------

    @Override
    public void construirAireAcond() {
        this.coche.setAireAcond( true );
    }

    // ------------------------------

    @Override
    public void construirElevalunas() {
        this.coche.setElevalunasElec( true);
    }
}

Coche.java (un Product en el diagrama anterior):

package Builder01;

public class Coche
{
    private String motor = "";
    private String carroceria = "";
    private Boolean elevalunasElec = false;
    private Boolean aireAcond = false;

    // -------------------------------------------

    public Coche() {
    }

    // -------------------------------------------

    public String getMotor() {
        return this.motor;
    }

    // -------------------------------------------

    public void setMotor(String motor) {
        this.motor = motor;
    }

    // -------------------------------------------

    public String getCarroceria() {
        return this.carroceria;
    }

    // -------------------------------------------

    public void setCarroceria(String carroceria) {
        this.carroceria = carroceria;
    }

    // -------------------------------------------

    public Boolean getElevalunasElec() {
        return elevalunasElec;
    }

    // -------------------------------------------

    public void setElevalunasElec(Boolean elevalunasElec) {
        this.elevalunasElec = elevalunasElec;
    }

    // -------------------------------------------

    public Boolean getAireAcond() {
        return aireAcond;
    }

    // -------------------------------------------

    public void setAireAcond(Boolean aireAcond) {
        this.aireAcond = aireAcond;
    }
}

Al ejecutarlo obtendremos el siguiente resultado:

Ejemplo

EXPLICACIÓN:

  • En el programa principal creamos el objeto de tipo Director, así como los de tipo ConcreteBuilder que le iremos pasando a continuación como parámetro a través de su método construir() (con el fin de crear objetos Coche equipados de diferentes formas).
  • Observa que en dicho método se llama a su vez a los diferentes métodos de la clase BuilderCoche, mediante los que se crea un nuevo objeto de tipo Coche y se componen las diferentes partes del mismo.
  • Posteriormente se realiza una llamada al método getCoche() del objeto de tipo Director para obtener cada objeto de tipo Coche, y se muestran sus características.
Primera página Anterior Siguiente Última página
Usamos cookies para ofrecerte una experiencia mejorada, el continuar navegando supone que aceptas su uso