Middle
Mis on disainimuster 'Builder'?
sobes.tech AI
Vastus AI-lt
„Ehitusmeistri“ (Builder) muster on loomise muster, mis on mõeldud keeruliste objektide samm-sammult loomise jaoks. See eraldab keerulise objekti ehitusprotsessi selle esitlusest nii, et sama ehitusprotsess võib luua erinevaid esitlusi.
Töö põhimõtted:
- Jagamine: Eraldab objekti loomise loogika ise objektist.
- Edastamine: Klientkood (Director) edastab objekti loomise eraldi klassile (Builder).
- Samm-sammult loomine: Objekt kogutakse koostisosadest, kasutades ehitaja meetodite kogumit.
Peamised osalejad:
- Toode: Keeruline objekt, mida soovime luua. Ei sõltu loomise protsessist.
- Builder: Abstraktne liides, mis määratleb sammud toote ehitamiseks.
- ConcreteBuilder: Konkreetne teostus, mis realiseerib sammud ja pakub meetodit valmis toote saamiseks.
- Director (valikuline): Määrab ehitussammude järjekorra. Ei ole kohustuslik, klientkood võib otse suhelda ConcreteBuilderiga.
Eelised:
- võimaldab luua objekte, millel on palju kohustuslikke parameetreid, selgemalt kui paljude argumentidega konstruktorid või setterite ahelad.
- võimaldab luua erinevaid variatsioone ühe ja sama objekti kasutades sama ehitusprotsessi.
- varjab loodava objekti sisemist struktuuri.
Puudused:
- võib suurendada klasside arvu projektis (Builder, ConcreteBuilder, Product, Director).
Näide: objekti Pizza loomine erinevate koostisosadega:
// Toode
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;
}
}
// Ehitusmeistri liides
public interface PizzaBuilder {
void buildDough();
void buildSauce();
void buildCheese();
void addTopping(String topping);
Pizza getPizza();
}
// Konkreetne ehitaja
public class MargheritaPizzaBuilder implements PizzaBuilder {
private Pizza pizza;
public MargheritaPizzaBuilder() {
this.pizza = new Pizza();
this.pizza.setToppings(new ArrayList<>()); // Toppingute nimekirja initsialiseerimine
}
@Override
public void buildDough() {
pizza.setDough("Õhuke koor");
}
@Override
public void buildSauce() {
pizza.setSauce("Tomatimahl");
}
@Override
public void buildCheese() {
pizza.setCheese("Mozzarella");
}
@Override
public void addTopping(String topping) {
// Margherita ei lisa täiendavaid toppinge, välja arvatud põhivõimalused
}
@Override
public Pizza getPizza() {
return this.pizza;
}
}
// Juht (valikuline)
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();
// Võivad olla kutsutud ka teised meetodid, näiteks addTopping() teises ehitajas
}
}
Kasutus:
// Klientkood
Kitchen kitchen = new Kitchen();
PizzaBuilder margheritaBuilder = new MargheritaPizzaBuilder();
kitchen.setPizzaBuilder(margheritaBuilder);
kitchen.constructPizza();
Pizza margherita = kitchen.getPizza();
System.out.println(margherita); // Väljund: Pizza with dough=Õhuke koor, sauce=Tomatimahl, cheese=Mozzarella, toppings=[]