Middle
Šta je obrazac dizajna 'Builder'?
sobes.tech АИ
Одговор од АИ
Dizajn obrazac "Builder" (Graditelj) je obrazac za kreiranje koji pruža način za postepenu izgradnju složenog objekta. On odvaja proces konstruisanja složenog objekta od njegove prezentacije, omogućavajući korišćenje istog procesa konstruisanja za kreiranje različitih prezentacija.
Ključne komponente obrasca:
- Builder: Apstraktni ili konkretni interfejs (ili klasa), koji definiše skup metoda za postepenu izgradnju delova proizvoda.
- ConcreteBuilder: Konkretna implementacija Builder-a koja kreira specifičnu prezentaciju proizvoda. Poznaje sve detalje izgradnje.
- Director: Opcionalna, ali često korišćena klasa. Određuje redosled poziva koraka izgradnje da bi se kreirala određena konfiguracija proizvoda.
- Product: Složen objekat koji se gradi. Sastoji se od više delova.
Prednosti:
- Omogućava postepenu izgradnju složenih objekata, izbegavajući "teleskopske" konstruktore (konstruktore sa mnogo parametara).
- Inkapsulira logiku kreiranja složenog objekta.
- Olakšava promenu unutrašnjeg prikaza proizvoda.
- Omogućava korišćenje istog procesa izgradnje za kreiranje različitih varijanti proizvoda.
Primene:
- Kada proces kreiranja objekta uključuje mnogo koraka, i ti koraci moraju biti izvršeni u određenom redosledu.
- Kada je potrebno imati različite prikaze istog objekta.
- Kada konstruktor objekta ima mnogo opcionalnih parametara.
Primer:
// Proizvod
class Pizza {
private String testo = "";
private String sos = "";
private List<String> dodaci = new ArrayList<>();
public void setTesto(String testo) {
this.testo = testo;
}
public void setSos(String sos) {
this.sos = sos;
}
public void addDodatak(String dodatak) {
this.dodaci.add(dodatak);
}
@Override
public String toString() {
return "Pizza sa testom: " + testo + ", sos: " + sos + ", dodaci: " + dodaci;
}
}
// Interfejs graditelja
interface PizzaBuilder {
void buildTesto();
void buildSos();
void buildDodaci();
Pizza getPizza();
}
// Konkretni graditelj
class MargheritaPizzaBuilder implements PizzaBuilder {
private Pizza pizza = new Pizza();
@Override
public void buildTesto() {
pizza.setTesto("tanko testo");
}
@Override
public void buildSos() {
pizza.setSos("paradajz");
}
@Override
public void buildDodaci() {
pizza.addDodatak("mozzarella");
pizza.addDodatak("bosiljak");
}
@Override
public Pizza getPizza() {
return this.pizza;
}
}
// Direktor (opciono)
class Kuvar {
private PizzaBuilder pizzaBuilder;
public void setPizzaBuilder(PizzaBuilder pb) {
pizzaBuilder = pb;
}
public Pizza getPizza() {
return pizzaBuilder.getPizza();
}
public void sastaviPizza() {
pizzaBuilder.buildTesto();
pizzaBuilder.buildSos();
pizzaBuilder.buildDodaci();
}
}
// Upotreba
public class BuilderExample {
public static void main(String[] args) {
Kuvar kuvar = new Kuvar();
PizzaBuilder margheritaBuilder = new MargheritaPizzaBuilder();
kuvar.setPizzaBuilder(margheritaBuilder);
kuvar.sastaviPizza();
Pizza margherita = kuvar.getPizza();
System.out.println(margherita);
}
}
U kontekstu automatizacije testiranja, "Builder" se često koristi za kreiranje testnih podataka ili složenih testnih objekata (npr. korisnički objekat sa mnogo atributa, objekat narudžbine sa više stavki), kada je potrebno fleksibilno konfigurisati različite varijante ovih podataka za različite test scenarije.