Sobes.tech
Middle

Was ist das Entwurfsmuster 'Builder' (Builder)?

sobes.tech KI

Antwort von AI

Das Entwurfsmuster "Builder" ist ein kreierendes Muster, das eine Methode bereitstellt, um ein komplexes Objekt schrittweise zu erstellen. Es trennt den Konstruktionsprozess eines komplexen Objekts von seiner Darstellung, was die Verwendung desselben Konstruktionsprozesses zur Erstellung verschiedener Darstellungen ermöglicht.

Schlüsselkomponenten des Musters:

  • Builder: Abstrakte oder konkrete Schnittstelle (oder Klasse), die eine Reihe von Methoden zur schrittweisen Konstruktion der Teile des Produkts definiert.
  • ConcreteBuilder: Konkrete Implementierung von Builder, die eine spezifische Darstellung des Produkts erstellt. Kennt alle Details der Konstruktion.
  • Director: Optional, aber häufig verwendete Klasse. Bestimmt die Reihenfolge der Aufrufe der Konstruktionsschritte, um eine bestimmte Konfiguration des Produkts zu erstellen.
  • Product: Das komplexe Objekt, das gebaut wird. Es besteht aus vielen Teilen.

Vorteile:

  • Ermöglicht die schrittweise Erstellung komplexer Objekte, wodurch "teleskopische" Konstruktoren (Konstruktoren mit vielen Parametern) vermieden werden.
  • Kapselt die Logik der Erstellung des komplexen Objekts.
  • Erleichtert Änderungen an der internen Darstellung des Produkts.
  • Ermöglicht die Verwendung desselben Konstruktionsprozesses zur Erstellung verschiedener Varianten des Produkts.

Anwendbarkeit:

  • Wenn der Erstellungsprozess eines Objekts viele Schritte umfasst und diese in einer bestimmten Reihenfolge ausgeführt werden müssen.
  • Wenn verschiedene Darstellungen desselben Objekts erforderlich sind.
  • Wenn der Konstruktor des Objekts viele optionale Parameter hat.

Beispiel:

// Produkt
class Pizza {
    private String dough = "";
    private String sauce = "";
    private List<String> toppings = new ArrayList<>();

    public void setDough(String dough) {
        this.dough = dough;
    }

    public void setSauce(String sauce) {
        this.sauce = sauce;
    }

    public void addTopping(String topping) {
        this.toppings.add(topping);
    }

    @Override
    public String toString() {
        return "Pizza mit Teig: " + dough + ", Soße: " + sauce + ", Beläge: " + toppings;
    }
}

// Schnittstelle des Builders
interface PizzaBuilder {
    void buildDough();
    void buildSauce();
    void buildToppings();
    Pizza getPizza();
}

// Konkreter Builder
class MargheritaPizzaBuilder implements PizzaBuilder {
    private Pizza pizza = new Pizza();

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

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

    @Override
    public void buildToppings() {
        pizza.addTopping("Mozzarella");
        pizza.addTopping("Basilikum");
    }

    @Override
    public Pizza getPizza() {
        return this.pizza;
    }
}

// Director (optional)
class Cook {
    private PizzaBuilder pizzaBuilder;

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

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

    public void constructPizza() {
        pizzaBuilder.buildDough();
        pizzaBuilder.buildSauce();
        pizzaBuilder.buildToppings();
    }
}

// Verwendung
public class BuilderExample {
    public static void main(String[] args) {
        Cook cook = new Cook();
        PizzaBuilder margheritaBuilder = new MargheritaPizzaBuilder();

        cook.setPizzaBuilder(margheritaBuilder);
        cook.constructPizza();

        Pizza margherita = cook.getPizza();
        System.out.println(margherita);
    }
}

Im Kontext der Testautomatisierung wird "Builder" häufig verwendet, um Testdaten oder komplexe Testobjekte zu erstellen (z.B. ein Benutzerobjekt mit mehreren Attributen, eine Bestellung mit mehreren Positionen), wenn es notwendig ist, verschiedene Varianten dieser Daten flexibel für unterschiedliche Testszenarien zu konfigurieren.