Sobes.tech
Middle

O que é o padrão de projeto 'Builder' (Construtor)?

sobes.tech IA

Resposta da IA

O padrão "Builder" (Construtor) é um padrão de design criacional que permite criar objetos complexos passo a passo, fornecendo várias opções de configuração.

  • Propósito: Separar o processo de construção de um objeto da sua representação. Permite obter diferentes representações do mesmo processo de construção.
  • Vantagens:
    • Permite construir um objeto passo a passo, ocultando os detalhes da construção.
    • Facilita a criação de objetos com um grande número de parâmetros opcionais (diferente dos construtores com múltiplos argumentos ou do anti-padrão Telescoping Constructors).
    • Pode usar o mesmo código de construção para criar diferentes representações do objeto.
  • Principais participantes:
    1. Builder (Construtor): Interface ou classe abstrata que define os passos para construir as partes do objeto.
    2. ConcreteBuilder (Construtor Concreto): Implementação da interface Builder, que cria partes específicas do objeto e fornece um método para obter o resultado final.
    3. Director (Diretor): Define a sequência de passos para criar o objeto, usando um objeto Builder. O Diretor é opcional e o cliente pode trabalhar diretamente com o Builder.
    4. Product (Produto): O objeto que está sendo construído.

Exemplo de estrutura (Java):

// Produto
class Car {
    private String engine;
    private int wheels;
    private String color;

    public void setEngine(String engine) {
        this.engine = engine;
    }

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

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

    @Override
    public String toString() {
        return "Car [engine=" + engine + ", wheels=" + wheels + ", color=" + color + "]";
    }
}

// Interface Builder
interface CarBuilder {
    void buildEngine();
    void buildWheels();
    void buildColor();
    Car getResult();
}

// ConcreteBuilder
class SportsCarBuilder implements CarBuilder {
    private Car car = new Car();

    @Override
    public void buildEngine() {
        car.setEngine("V8");
    }

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

    @Override
    public void buildColor() {
        car.setColor("Red");
    }

    @Override
    public Car getResult() {
        return car;
    }
}

// Director (Opcional)
class CarDirector {
    private CarBuilder builder;

    public CarDirector(CarBuilder builder) {
        this.builder = builder;
    }

    public void constructCar() {
        builder.buildEngine();
        builder.buildWheels();
        builder.buildColor();
    }
}

// Uso do cliente
public class Client {
    public static void main(String[] args) {
        CarBuilder sportsCarBuilder = new SportsCarBuilder();
        CarDirector director = new CarDirector(sportsCarBuilder);

        director.constructCar();
        Car sportsCar = sportsCarBuilder.getResult();
        System.out.println("Built car: " + sportsCar);

        // Uso direto sem o Diretor
        CarBuilder anotherSportsCarBuilder = new SportsCarBuilder();
        anotherSportsCarBuilder.buildEngine();
        anotherSportsCarBuilder.buildColor(); // Construção sem rodas
        Car partialCar = anotherSportsCarBuilder.getResult();
        System.out.println("Built partial car: " + partialCar);
    }
}