Middle
Kas yra builder (konstruktorius) programinės įrangos kūrimo kontekste?
sobes.tech AI
Atsakymas iš AI
Dizaino šablonas, kuris atskiria sudėtingo objekto konstravimą nuo jo pateikimo, leidžiant kurti įvairius to paties konstravimo proceso vaizdus.
Pagrindinės savybės:
- Atsakomybės pasidalijimas: Objekto kūrimo logika (konstravimo žingsniai) ir objekto pateikimas (galutinis produktas) yra atskirti.
- Žingsnis po žingsnio konstravimas: Objekto kūrimas vyksta žingsnis po žingsnio, tai daro procesą lankstesnį ir aiškesnį.
- Įvairūs pateikimai: Vienas ir tas pats konstravimo procesas gali būti naudojamas kuriant skirtingas objekto variacijas.
- Inkapusuliacija: Konstravimo detalės yra paslėptos nuo kliento, tai palengvina naudojimą.
Pagrindiniai dalyviai:
- Builder (Konstruktorius): Abstrakti sąsaja arba klasė, apibrėžianti žingsnius produkto dalių kūrimui.
- ConcreteBuilder (Konkretus konstruktorius): Konkretus Konstruktoriaus įgyvendinimas, kuris vykdo faktinį dalių kūrimą ir saugo rezultatą.
- Director (Direktorius): Klasė, kuri naudoja ConcreteBuilder objektą produkto kūrimui, iškviečiant atitinkamus konstruktoriaus metodus nustatyta seka.
- Product (Produktas): Sudėtingas objektas, kuris yra kuriamas.
Pavyzdys:
Sukurti Pizza objektą su skirtingais ingredientais:
// Produktas
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;
}
}
// Konstruktoriaus sąsaja
interface PizzaBuilder {
void buildDough();
void buildSauce();
void buildCheese();
void addTopping(String topping);
Pizza getResult();
}
// Konkretaus konstruktorius
class MargheritaPizzaBuilder implements PizzaBuilder {
private Pizza pizza;
public MargheritaPizzaBuilder() {
this.pizza = new Pizza();
}
@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 neturi papildomų priedų pagal numatytuosius nustatymus
}
@Override
public Pizza getResult() {
return pizza;
}
}
// Direktorius
class Cook {
private PizzaBuilder pizzaBuilder;
public void setPizzaBuilder(PizzaBuilder pb) {
pizzaBuilder = pb;
}
public void constructPizza() {
pizzaBuilder.buildDough();
pizzaBuilder.buildSauce();
pizzaBuilder.buildCheese();
// Papildomi priedai gali būti pridėti čia pagal poreikį
}
}
// Kliento kodas
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);
}
}
Naudojama, kai:
- Reikia sukurti sudėtingą objektą su daugybe neprivalomų parametrų.
- Objekto kūrimo procesas yra nuoseklus ir apima daug žingsnių.
- Reikia sukurti skirtingas vieno ir to paties objekto variacijas naudojant tą patį konstravimo algoritmą.
- Reikia išvengti daugybės konstruktorių ("telescoping constructor").
Privalumai:
- Pagerina kodo skaitomumą ir palaikymą.
- Suteikia lankstumą kuriant objektus.
- Leidžia kurti nekintamus objektus.
- Pašalina poreikį turėti daug konstruktorių.
Trūkumai:
- Gali padidinti klasių skaičių projekte.
- Reikalauja pradinių projektavimo pastangų.