Sobes.tech
Middle

Wat is het ontwerp patroon 'Builder' (Bouwer)?

sobes.tech AI

Antwoord van AI

Het "Builder"-patroon (Bouwer) is een creational design pattern dat het mogelijk maakt om complexe objecten stapsgewijs te creëren, met verschillende configuratie-opties.

  • Doel: Het bouwproces van een object scheiden van de representatie ervan. Het maakt het mogelijk om verschillende representaties van hetzelfde bouwproces te verkrijgen.
  • Voordelen:
    • Maakt het mogelijk om een object stapsgewijs te bouwen, waarbij de details van de constructie verborgen blijven.
    • Vereenvoudigt het maken van objecten met veel optionele parameters (in tegenstelling tot constructors met meerdere argumenten of het anti-patroon Telescoping Constructors).
    • Dezelfde bouwcode kan worden gebruikt om verschillende representaties van het object te maken.
  • Belangrijke deelnemers:
    1. Builder (Bouwer): Interface of abstracte klasse die de stappen definieert voor het bouwen van de delen van het object.
    2. ConcreteBuilder (Concrete Bouwer): Implementatie van de Builder-interface die specifieke delen van het object creëert en een methode biedt om het uiteindelijke resultaat te verkrijgen.
    3. Director (Regisseur): Bepaalt de volgorde van stappen voor het maken van het object, gebruikmakend van een Builder-object. De Regisseur is optioneel en de klant kan direct met de Bouwer werken.
    4. Product (Product): Het object dat wordt gebouwd.

Voorbeeldstructuur (Java):

// Product
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 + "]";
    }
}

// Builder-interface
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 (Optioneel)
class CarDirector {
    private CarBuilder builder;

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

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

// Clientgebruik
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("Gebouwde auto: " + sportsCar);

        // Direct gebruik zonder Director
        CarBuilder anotherSportsCarBuilder = new SportsCarBuilder();
        anotherSportsCarBuilder.buildEngine();
        anotherSportsCarBuilder.buildColor(); // Bouwen zonder wielen
        Car partialCar = anotherSportsCarBuilder.getResult();
        System.out.println("Gedeeltelijke auto: " + partialCar);
    }
}