Introducció al Patró Builder

El patró Builder és un patró creacional que permet la construcció d'objectes complexos pas a pas. A diferència d'altres patrons creacionals que enfoquen la creació d'objectes a partir d'una interfície comuna, el Builder separa la construcció d'un objecte de la seva representació, permetent crear diferents representacions de l'objecte utilitzant el mateix procés de construcció.

Quan Utilitzar el Patró Builder

  • Quan la creació d'un objecte implica molts passos o configuracions.
  • Quan es vol evitar la complexitat de constructors amb molts paràmetres.
  • Quan es vol crear diferents representacions d'un mateix objecte.

Components del Patró Builder

  1. Builder: Defineix una interfície abstracta per crear parts d'un objecte Producte.
  2. ConcreteBuilder: Implementa la interfície Builder i construeix les parts específiques del Producte.
  3. Product: Representa l'objecte complex que es construeix.
  4. Director: Controla el procés de construcció utilitzant un objecte Builder.

Exemple Pràctic

A continuació, es presenta un exemple pràctic del patró Builder en Java. Suposem que volem construir una casa amb diferents característiques com ara el nombre de finestres, portes, i el tipus de sostre.

Definició del Producte

public class House {
    private int windows;
    private int doors;
    private String roofType;

    public void setWindows(int windows) {
        this.windows = windows;
    }

    public void setDoors(int doors) {
        this.doors = doors;
    }

    public void setRoofType(String roofType) {
        this.roofType = roofType;
    }

    @Override
    public String toString() {
        return "House [windows=" + windows + ", doors=" + doors + ", roofType=" + roofType + "]";
    }
}

Definició del Builder

public abstract class HouseBuilder {
    protected House house;

    public House getHouse() {
        return house;
    }

    public void createNewHouse() {
        house = new House();
    }

    public abstract void buildWindows();
    public abstract void buildDoors();
    public abstract void buildRoof();
}

Implementació del ConcreteBuilder

public class ConcreteHouseBuilder extends HouseBuilder {

    @Override
    public void buildWindows() {
        house.setWindows(4);
    }

    @Override
    public void buildDoors() {
        house.setDoors(2);
    }

    @Override
    public void buildRoof() {
        house.setRoofType("Gable");
    }
}

Definició del Director

public class HouseDirector {
    private HouseBuilder houseBuilder;

    public HouseDirector(HouseBuilder houseBuilder) {
        this.houseBuilder = houseBuilder;
    }

    public void constructHouse() {
        houseBuilder.createNewHouse();
        houseBuilder.buildWindows();
        houseBuilder.buildDoors();
        houseBuilder.buildRoof();
    }

    public House getHouse() {
        return houseBuilder.getHouse();
    }
}

Utilització del Patró Builder

public class BuilderPatternDemo {
    public static void main(String[] args) {
        HouseBuilder builder = new ConcreteHouseBuilder();
        HouseDirector director = new HouseDirector(builder);

        director.constructHouse();
        House house = director.getHouse();

        System.out.println(house);
    }
}

Exercicis Pràctics

Exercici 1: Crear un Vehicle

Descripció: Implementa el patró Builder per construir un objecte Vehicle amb les següents característiques: nombre de rodes, tipus de motor, i color.

Solució:

  1. Definició del Producte
public class Vehicle {
    private int wheels;
    private String engineType;
    private String color;

    public void setWheels(int wheels) {
        this.wheels = wheels;
    }

    public void setEngineType(String engineType) {
        this.engineType = engineType;
    }

    public void setColor(String color) {
        this.color = color;
    }

    @Override
    public String toString() {
        return "Vehicle [wheels=" + wheels + ", engineType=" + engineType + ", color=" + color + "]";
    }
}
  1. Definició del Builder
public abstract class VehicleBuilder {
    protected Vehicle vehicle;

    public Vehicle getVehicle() {
        return vehicle;
    }

    public void createNewVehicle() {
        vehicle = new Vehicle();
    }

    public abstract void buildWheels();
    public abstract void buildEngine();
    public abstract void buildColor();
}
  1. Implementació del ConcreteBuilder
public class CarBuilder extends VehicleBuilder {

    @Override
    public void buildWheels() {
        vehicle.setWheels(4);
    }

    @Override
    public void buildEngine() {
        vehicle.setEngineType("V8");
    }

    @Override
    public void buildColor() {
        vehicle.setColor("Red");
    }
}
  1. Definició del Director
public class VehicleDirector {
    private VehicleBuilder vehicleBuilder;

    public VehicleDirector(VehicleBuilder vehicleBuilder) {
        this.vehicleBuilder = vehicleBuilder;
    }

    public void constructVehicle() {
        vehicleBuilder.createNewVehicle();
        vehicleBuilder.buildWheels();
        vehicleBuilder.buildEngine();
        vehicleBuilder.buildColor();
    }

    public Vehicle getVehicle() {
        return vehicleBuilder.getVehicle();
    }
}
  1. Utilització del Patró Builder
public class BuilderPatternVehicleDemo {
    public static void main(String[] args) {
        VehicleBuilder builder = new CarBuilder();
        VehicleDirector director = new VehicleDirector(builder);

        director.constructVehicle();
        Vehicle vehicle = director.getVehicle();

        System.out.println(vehicle);
    }
}

Resum

El patró Builder és una eina poderosa per a la creació d'objectes complexos de manera controlada i flexible. Permet separar la construcció d'un objecte de la seva representació, facilitant la creació de diferents versions d'un mateix objecte. A través d'aquest mòdul, hem explorat la seva estructura, components i aplicació pràctica amb exemples detallats.

© Copyright 2024. Tots els drets reservats