Sobes.tech
Middle

Čo je to návrhový vzor 'Builder'?

sobes.tech AI

Odpoveď od AI

Dizajnový vzor "Builder" (Staviteľ) je tvorivý vzor, ktorý poskytuje spôsob, ako krok za krokom vytvoriť zložitý objekt. Oddelí proces konštrukcie zložitých objektov od ich reprezentácie, čo umožňuje použiť rovnaký proces konštrukcie na vytvorenie rôznych reprezentácií.

Kľúčové komponenty vzoru:

  • Builder: Abstraktné alebo konkrétne rozhranie (alebo trieda), ktorá definuje sadu metód na postupné zostavenie častí produktu.
  • ConcreteBuilder: Konkrétna implementácia Buildera, ktorá vytvára špecifickú reprezentáciu produktu. Pozná všetky detaily konštrukcie.
  • Director: Voliteľná, ale často používaná trieda. Určuje poradie volaní krokov konštrukcie, aby vytvorila určitú konfiguráciu produktu.
  • Product: Zložitý objekt, ktorý sa stavia. Skladá sa z viacerých častí.

Výhody:

  • Umožňuje krok za krokom vytvárať zložité objekty, vyhýbajúc sa "teleskopickým" konštruktorom (konštruktorom s veľkým počtom parametrov).
  • Zapuzdruje logiku tvorby zložitých objektov.
  • Uľahčuje zmenu vnútorného zobrazenia produktu.
  • Umožňuje použiť rovnaký konštrukčný proces na vytvorenie rôznych variantov produktu.

Použitie:

  • Keď proces tvorby objektu zahŕňa veľa krokov a tieto kroky musia byť vykonané v určitom poradí.
  • Keď je potrebné mať rôzne zobrazenia toho istého objektu.
  • Keď má konštruktor objektu veľmi veľa voliteľných parametrov.

Príklad:

// Produkt
class Pizza {
    private String cesto = "";
    private String omáčka = "";
    private List<String> prísady = new ArrayList<>();

    public void setCesto(String cesto) {
        this.cesto = cesto;
    }

    public void setOmáčka(String omáčka) {
        this.omáčka = omáčka;
    }

    public void addPrísada(String prísada) {
        this.prísady.add(prísada);
    }

    @Override
    public String toString() {
        return "Pizza s cestom: " + cesto + ", omáčka: " + omáčka + ", prísady: " + prísady;
    }
}

// Rozhranie Builder
interface PizzaBuilder {
    void buildCesto();
    void buildOmáčka();
    void buildPrísady();
    Pizza getPizza();
}

// Konkrétny Builder
class MargheritaPizzaBuilder implements PizzaBuilder {
    private Pizza pizza = new Pizza();

    @Override
    public void buildCesto() {
        pizza.setCesto("tenké cesto");
    }

    @Override
    public void buildOmáčka() {
        pizza.setOmáčka("paradajková");
    }

    @Override
    public void buildPrísady() {
        pizza.addPrísada("mozzarella");
        pizza.addPrísada("bazalka");
    }

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

// Riaditeľ (voliteľný)
class Kuchár {
    private PizzaBuilder pizzaBuilder;

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

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

    public void zostaviťPizza() {
        pizzaBuilder.buildCesto();
        pizzaBuilder.buildOmáčka();
        pizzaBuilder.buildPrísady();
    }
}

// Použitie
public class BuilderExample {
    public static void main(String[] args) {
        Kuchár kuchár = new Kuchár();
        PizzaBuilder margheritaBuilder = new MargheritaPizzaBuilder();

        kuchár.setPizzaBuilder(margheritaBuilder);
        kuchár.zostaviťPizza();

        Pizza margherita = kuchár.getPizza();
        System.out.println(margherita);
    }
}

V kontexte automatizácie testovania sa "Builder" často používa na vytváranie testovacích dát alebo zložitých testovacích objektov (napríklad používateľský objekt s mnohými atribútmi, objednávka s viacerými položkami), keď je potrebné flexibilne nakonfigurovať rôzne varianty týchto dát pre rôzne testovacie scenáre.