Middle
Mis on disainimuster 'Builder'?
sobes.tech AI
Vastus AI-lt
Disaini muster "Ehitusmees" (Builder) on päritolu muster, mis pakub viisi, kuidas luua keeruline objekt samm-sammult. See eraldab keeruka objekti ehitusprotsessi selle esitlusest, võimaldades kasutada sama ehitusprotsessi erinevate esituste loomiseks.
Mustri põhikomponendid:
- Builder: Abstraktne või konkreetne liides (või klass), mis määratleb meetodite kogumi, et samm-sammult ehitada toote osi.
- ConcreteBuilder: Konkreetne Builderi teostus, mis loob spetsiifilise toote esituse. Ta teab kõiki ehituse detaile.
- Director: Valikuline, kuid sageli kasutatav klass. Määrab ehitussammude järjekorra, et luua teatud toote konfiguratsioon.
- Product: Keeruline objekt, mida ehitatakse. Koosneb paljudest osadest.
Eelised:
- Võimaldab samm-sammult luua keerulisi objekte, vältides "teleskoopseid" konstruktorid (konstruktorid, millel on palju parameetreid).
- Inkapsuleerib keeruka objekti loomise loogika.
- Lihtsustab toote sisemise esituse muutmist.
- Võimaldab kasutada sama ehitusprotsessi erinevate tootevariantide loomiseks.
Rakendused:
- Kui objekti loomise protsess hõlmab palju samme ja need sammud peavad toimuma kindlas järjekorras.
- Kui on vaja erinevaid sama objekti esitusi.
- Kui objekti konstruktoril on väga palju valikulisi parameetreid.
Näide:
// Toode
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;
}
}
// Disaini liides
interface PizzaBuilder {
void buildDough();
void buildSauce();
void buildToppings();
Pizza getPizza();
}
// Konkreetne ehitaja
class MargheritaPizzaBuilder implements PizzaBuilder {
private Pizza pizza = new Pizza();
@Override
public void buildDough() {
pizza.setDough("õhuke koor");
}
@Override
public void buildSauce() {
pizza.setSauce("tomat");
}
@Override
public void buildToppings() {
pizza.addTopping("mozzarella");
pizza.addTopping("basiilik");
}
@Override
public Pizza getPizza() {
return this.pizza;
}
}
// Direktori (valikuline)
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();
}
}
// Kasutamine
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);
}
}
Automatiseerimise testimise kontekstis kasutatakse "Ehitusmeest" sageli testandmete või keerukate testobjektide (näiteks kasutajaobjekti paljude atribuutidega, tellimuseobjekti mitme positsiooniga) loomisel, kui on vaja paindlikult konfigureerida nende andmete erinevaid variatsioone erinevate teststsenaariumide jaoks.