Sobes.tech
Middle

Was ist das Entwurfsmuster 'Builder' (Builder)?

sobes.tech KI

Antwort von AI

Das "Builder"-Muster (Builder) ist ein creational Pattern, das dazu dient, komplexe Objekte schrittweise zu erstellen. Es trennt den Konstruktionsprozess eines komplexen Objekts von seiner Darstellung, sodass derselbe Konstruktionsprozess verschiedene Darstellungen erzeugen kann.

Funktionsprinzipien:

  1. Trennung: Trennt die Logik der Objekterstellung vom Objekt selbst.
  2. Delegation: Der Client-Code (Director) delegiert die Objekterstellung an eine separate Klasse (Builder).
  3. Schrittweise Erstellung: Das Objekt wird aus Komponenten mithilfe eines Satzes von Builder-Methoden zusammengesetzt.

Hauptakteure:

  • Produkt: Das komplexe Objekt, das wir bauen möchten. Es ist unabhängig vom Erstellungsprozess.
  • Builder: Abstrakte Schnittstelle, die die Schritte zur Konstruktion des Produkts definiert.
  • ConcreteBuilder: Konkrete Implementierung von Builder, die die Bau-Schritte ausführt und eine Methode zum Erhalt des fertigen Produkts bereitstellt.
  • Director (Optional): Bestimmt die Reihenfolge der Aufrufe der Bau-Schritte. Es ist nicht zwingend, der Client-Code kann direkt mit ConcreteBuilder interagieren.

Vorteile:

  • Ermöglicht die Erstellung von Objekten mit vielen optionalen Parametern auf eine lesbarere Weise als mit Konstruktoren mit vielen Argumenten oder Setter-Ketten.
  • Ermöglicht die Erstellung verschiedener Variationen eines Objekts unter Verwendung desselben Bauprozesses.
  • Verbirgt die interne Struktur des erstellten Objekts.

Nachteile:

  • Kann die Anzahl der Klassen im Projekt erhöhen (Builder, ConcreteBuilder, Product, Director).

Beispiel: Erstellung eines Pizza-Objekts mit verschiedenen Zutaten.

// Produkt
public class Pizza {
    private String dough;
    private String sauce;
    private String cheese;
    private List<String> toppings;

    public void setDough(String dough) { this.dough = dough; }
    public void setSauce(String sauce) { this.sauce = sauce; }
    public void setCheese(String cheese) { this.cheese = cheese; }
    public void setToppings(List<String> toppings) { this.toppings = toppings; }

    @Override
    public String toString() {
        return "Pizza mit Teig=" + dough + ", Sauce=" + sauce + ", Käse=" + cheese + ", Beläge=" + toppings;
    }
}
// Builder
public interface PizzaBuilder {
    void buildDough();
    void buildSauce();
    void buildCheese();
    void addTopping(String topping);
    Pizza getPizza();
}
// ConcreteBuilder
public class MargheritaPizzaBuilder implements PizzaBuilder {
    private Pizza pizza;

    public MargheritaPizzaBuilder() {
        this.pizza = new Pizza();
        this.pizza.setToppings(new ArrayList<>()); // Initialisierung der Liste
    }

    @Override
    public void buildDough() {
        pizza.setDough("Dünner Teig");
    }

    @Override
    public void buildSauce() {
        pizza.setSauce("Tomatensauce");
    }

    @Override
    public void buildCheese() {
        pizza.setCheese("Mozzarella");
    }

    @Override
    public void addTopping(String topping) {
        // Margherita fügt keine Toppings außer den Basissorten hinzu
    }

    @Override
    public Pizza getPizza() {
        return this.pizza;
    }
}
// Director (Optional)
public class Kitchen {
    private PizzaBuilder pizzaBuilder;

    public void setPizzaBuilder(PizzaBuilder pb) {
        pizzaBuilder = pb;
    }

    public Pizza getPizza() {
        return pizzaBuilder.getPizza();
    }

    public void constructPizza() {
        pizzaBuilder.buildDough();
        pizzaBuilder.buildSauce();
        pizzaBuilder.buildCheese();
        // Weitere Methoden können aufgerufen werden, z.B. addTopping() in einem anderen Builder
    }
}

Verwendung:

// Client-Code
Kitchen kitchen = new Kitchen();
PizzaBuilder margheritaBuilder = new MargheritaPizzaBuilder();

kitchen.setPizzaBuilder(margheritaBuilder);

kitchen.constructPizza();

Pizza margherita = kitchen.getPizza();
System.out.println(margherita); // Ausgabe: Pizza mit Teig=Dünner Teig, Sauce=Tomatensauce, Käse=Mozzarella, Beläge=[]