Middle
Kas yra dizaino šablonas 'Builder'?
sobes.tech AI
Atsakymas iš AI
„Kūrėjo“ (Builder) šablonas yra kūrimo šablonas, skirtas sudėtingų objektų kūrimui žingsnis po žingsnio. Jis atskiria sudėtingo objekto konstravimo procesą nuo jo vaizdavimo taip, kad tas pats konstravimo procesas gali sukurti įvairius vaizdus.
Veikimo principai:
- Skirstymas: Atskiria objekto kūrimo logiką nuo paties objekto.
- Paveldėjimas: Kliento kodas (Director) perduoda objekto kūrimą atskiram klasei (Builder).
- Žingsnis po žingsnio kūrimas: Objekto surinkimas iš sudėtinių dalių naudojant statyto metodo rinkinį.
Pagrindiniai dalyviai:
- Produktas: Sudėtingas objektas, kurį norime sukurti. Nėra priklausomas nuo kūrimo proceso.
- Builder: Abstraktus interfeisas, apibrėžiantis žingsnius Product kūrimui.
- ConcreteBuilder: Konkretus įgyvendinimas, kuris įgyvendina žingsnius ir teikia metodą gauti paruoštą Product.
- Director (pasirinktinai): Nustato kūrimo žingsnių tvarką. Nereikalaujama, klientų kodas gali tiesiogiai sąveikauti su ConcreteBuilder.
Privalumai:
- Leidžia kurti objektus su daug neprivalomų parametrų aiškesniu būdu nei naudojant daugybę konstruktorių ar sietų su srautu.
- Leidžia kurti įvairias vieno ir to paties objekto variacijas naudojant tą patį kūrimo procesą.
- Slėpia kuriamo objekto vidinę struktūrą.
Trūkumai:
- Gali padidinti klasių skaičių projekte (Builder, ConcreteBuilder, Product, Director).
Naudojimo pavyzdys: Pizza klasės objekto kūrimas su įvairiais ingredientais:
// Produktas
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 with dough=" + dough + ", sauce=" + sauce + ", cheese=" + cheese + ", toppings=" + toppings;
}
}
// Statytojas
public interface PizzaBuilder {
void buildDough();
void buildSauce();
void buildCheese();
void addTopping(String topping);
Pizza getPizza();
}
// Konkretus statytojas
public class MargheritaPizzaBuilder implements PizzaBuilder {
private Pizza pizza;
public MargheritaPizzaBuilder() {
this.pizza = new Pizza();
this.pizza.setToppings(new ArrayList<>()); // Toppingų sąrašo inicijavimas
}
@Override
public void buildDough() {
pizza.setDough("Plona pluta");
}
@Override
public void buildSauce() {
pizza.setSauce("Pomidorų padažas");
}
@Override
public void buildCheese() {
pizza.setCheese("Mozzarella");
}
@Override
public void addTopping(String topping) {
// Margherita ne pridės papildomų toppingų, išskyrus bazinius
}
@Override
public Pizza getPizza() {
return this.pizza;
}
}
// Direktorius (pasirinktinai)
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();
// Gali būti iškviesti kiti metodai, pvz., addTopping() kitame statytojui
}
}
Naudojimas:
// Kliento kodas
Kitchen kitchen = new Kitchen();
PizzaBuilder margheritaBuilder = new MargheritaPizzaBuilder();
kitchen.setPizzaBuilder(margheritaBuilder);
kitchen.constructPizza();
Pizza margherita = kitchen.getPizza();
System.out.println(margherita); // Išvestis: Pizza with dough=Plona pluta, sauce=Pomidorų padažas, cheese=Mozzarella, toppings=[]