Sobes.tech
Middle

Was ist das Entwurfsmuster 'Builder' (Builder)?

sobes.tech KI

Antwort von AI

Das Muster "Builder" (Builder) ist ein Erzeugungsmuster im Software-Design, das die schrittweise Erstellung komplexer Objekte ermöglicht und verschiedene Konfigurationsmöglichkeiten bietet.

  • Zweck: Den Bauprozess eines Objekts vom dessen Darstellung zu trennen. Es ermöglicht, verschiedene Darstellungen desselben Bauprozesses zu erhalten.
  • Vorteile:
    • Ermöglicht den schrittweisen Aufbau eines Objekts, wobei die Details der Konstruktion verborgen bleiben.
    • Erleichtert die Erstellung von Objekten mit vielen optionalen Parametern (im Gegensatz zu Konstruktoren mit vielen Argumenten oder dem Anti-Pattern Telescoping Constructors).
    • Der gleiche Baucode kann verwendet werden, um verschiedene Darstellungen des Objekts zu erstellen.
  • Hauptbeteiligte:
    1. Builder (Builder): Schnittstelle oder abstrakte Klasse, die die Schritte zum Aufbau der Teile des Objekts definiert.
    2. ConcreteBuilder (Konkreter Builder): Implementierung der Builder-Schnittstelle, die spezifische Teile des Objekts erstellt und eine Methode zum Erhalt des Endergebnisses bereitstellt.
    3. Director (Direktor): Bestimmt die Reihenfolge der Schritte zur Erstellung des Objekts unter Verwendung eines Builder-Objekts. Der Direktor ist optional, und der Kunde kann direkt mit dem Builder arbeiten.
    4. Product (Produkt): Das zu bauende Objekt.

Beispielstruktur (Java):

// Produkt
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-Schnittstelle
interface CarBuilder {
    void buildEngine();
    void buildWheels();
    void buildColor();
    Car getResult();
}

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

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

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

// Client-Nutzung
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);

        // Direkte Nutzung ohne Director
        CarBuilder anotherSportsCarBuilder = new SportsCarBuilder();
        anotherSportsCarBuilder.buildEngine();
        anotherSportsCarBuilder.buildColor(); // Bau ohne Räder
        Car partialCar = anotherSportsCarBuilder.getResult();
        System.out.println("Built partial car: " + partialCar);
    }
}