Sobes.tech
Middle

Čo je builder v kontexte vývoja softvéru?

sobes.tech AI

Odpoveď od AI

Vzor návrhu, ktorý oddeľuje konštrukciu zložitých objektov od ich prezentácie, umožňujúc vytváranie rôznych prezentácií toho istého konštrukčného procesu.

Kľúčové vlastnosti:

  • Rozdelenie zodpovednosti: Logika vytvárania objektu (kroky konštrukcie) a prezentácia objektu (výsledný produkt) sú oddelené.
  • Krok za krokom konštrukcia: Objekt je stavaný krok za krokom, čo robí proces tvorby flexibilnejším a zrozumiteľnejším.
  • Rôzne prezentácie: Jeden a ten istý konštrukčný proces môže byť použitý na vytvorenie rôznych variácií objektu.
  • Inkapsulácia: Detaily tvorby objektu sú skryté od klienta, čo zjednodušuje jeho použitie.

Hlavní účastníci:

  • Builder (Staviteľ): Abstraktné rozhranie alebo trieda, ktorá definuje kroky na vytvorenie častí produktu.
  • ConcreteBuilder (Konkrétny staviteľ): Konkrétna implementácia Staviteľa, ktorá vykonáva skutočnú konštrukciu častí produktu a uchováva výsledok.
  • Director (Riaditeľ): Trieda, ktorá používa objekt ConcreteBuilder na konštrukciu produktu, volaním príslušných metód staviteľa v určitej sekvencii.
  • Product (Produkt): Zložitý objekt, ktorý sa stavia.

Príklad použitia:

Vytvorenie objektu Pizza s rôznymi prísadami:

// Produkt
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 addTopping(String topping) {
        if (toppings == null) {
            toppings = new ArrayList<>();
        }
        toppings.add(topping);
    }

    @Override
    public String toString() {
        return "Pizza with dough: " + dough + ", sauce: " + sauce + ", cheese: " + cheese + ", toppings: " + toppings;
    }
}

// Rozhranie Builder
interface PizzaBuilder {
    void buildDough();
    void buildSauce();
    void buildCheese();
    void addTopping(String topping);
    Pizza getResult();
}

// Konkrétny Builder
class MargheritaPizzaBuilder implements PizzaBuilder {
    private Pizza pizza;

    public MargheritaPizzaBuilder() {
        this.pizza = new Pizza();
    }

    @Override
    public void buildDough() {
        pizza.setDough("Tenka kôrka");
    }

    @Override
    public void buildSauce() {
        pizza.setSauce("Paradajková omáčka");
    }

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

    @Override
    public void addTopping(String topping) {
        // Margherita nemá ďalšie prísady predvolene
    }

    @Override
    public Pizza getResult() {
        return pizza;
    }
}

// Riaditeľ
class Cook {
    private PizzaBuilder pizzaBuilder;

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

    public void constructPizza() {
        pizzaBuilder.buildDough();
        pizzaBuilder.buildSauce();
        pizzaBuilder.buildCheese();
        // Prídavné prísady môžu byť pridané tu na základe typu alebo požiadaviek pizze
    }
}

// Klientska kód
public class PizzaShop {
    public static void main(String[] args) {
        Cook cook = new Cook();
        PizzaBuilder margheritaBuilder = new MargheritaPizzaBuilder();

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

        Pizza pizza = margheritaBuilder.getResult();
        System.out.println(pizza);
    }
}

Používa sa, keď:

  • Je potrebné vytvoriť zložitý objekt s množstvom voliteľných parametrov.
  • Proces tvorby objektu je sekvenčný a zahŕňa mnoho krokov.
  • Je potrebné vytvoriť rôzne variácie toho istého objektu pomocou rovnakého algoritmu konštrukcie.
  • Je potrebné sa vyhnúť konštruktoru s veľkým počtom parametrov ("telescoping constructor").

Výhody:

  • Zlepšuje čitateľnosť a udržiavateľnosť kódu.
  • Poskytuje flexibilitu pri vytváraní objektov.
  • Umožňuje vytváranie nemenných objektov.
  • Odstraňuje potrebu veľkého množstva konštruktorov.

Nevýhody:

  • Môže zvýšiť počet tried v projekte (pre každý typ objektu a každého staviteľa).
  • Vyžaduje určitú počiatočnú prácu na návrhu.