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.