Middle
Kas yra dizaino šablonas 'Builder'?
sobes.tech AI
Atsakymas iš AI
Dizaino šablonas "Kūrėjas" (Builder) — tai kilmės šablonas, kuris suteikia būdą kurti sudėtingą objektą žingsnis po žingsnio. Jis atskiria sudėtingo objekto konstravimo procesą nuo jo pateikimo, leidžiant naudoti tą patį konstravimo procesą skirtingiems pateikimams.
Šablono pagrindiniai komponentai:
- Builder: Abstrakti arba konkretus sąsaja (arba klasė), apibrėžianti metodų rinkinį, skirtą žingsnis po žingsnio kurti produkto dalis.
- ConcreteBuilder: Konkretus Builder įgyvendinimas, kuris sukuria specifinį produkto pateikimą. Jis žino visas konstravimo detales.
- Director: Pasirinktinai, bet dažnai naudojama klasė. Nustato konstravimo žingsnių seką, kad sukurtų tam tikrą produkto konfigūraciją.
- Product: Sudėtingas objektas, kuris kuriamas. Sudarytas iš daugelio dalių.
Privalumai:
- Leidžia žingsnis po žingsnio kurti sudėtingus objektus, išvengiant "telescopinių" konstruktorių (konstruktoriai su daug parametrų).
- Inkuperuoja sudėtingo objekto kūrimo logiką.
- Supaprastina produkto vidinio pateikimo keitimą.
- Leidžia naudoti tą patį konstravimo procesą skirtingų produkto variantų kūrimui.
Taikymas:
- Kai objekto kūrimo procesas apima daug žingsnių, ir šie žingsniai turi būti atliekami tam tikra tvarka.
- Kai reikia turėti skirtingus to paties objekto pateikimus.
- Kai objekto konstruktorius turi labai daug pasirenkamų parametrų.
Pavyzdys:
// Produktas
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 with dough: " + dough + ", sauce: " + sauce + ", toppings: " + toppings;
}
}
// Dizaino sąsaja
interface PizzaBuilder {
void buildDough();
void buildSauce();
void buildToppings();
Pizza getPizza();
}
// Konkretus Kūrėjas
class MargheritaPizzaBuilder implements PizzaBuilder {
private Pizza pizza = new Pizza();
@Override
public void buildDough() {
pizza.setDough("plonas pluta");
}
@Override
public void buildSauce() {
pizza.setSauce("pomidorų");
}
@Override
public void buildToppings() {
pizza.addTopping("mozzarella");
pizza.addTopping("bazilikas");
}
@Override
public Pizza getPizza() {
return this.pizza;
}
}
// Direktorius (pasirinktinai)
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();
}
}
// Naudojimas
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);
}
}
Kontekste automatizacijos testavime, "Kūrėjas" dažnai naudojamas kuriant testinius duomenis arba sudėtingus testinius objektus (pavyzdžiui, naudotojo objektą su daugybe atributų, užsakymo objektą su keliomis pozicijomis), kai reikia lankstiai konfigūruoti įvairius šių duomenų variantus skirtingiems testų scenarijams.