Middle
Mi az a tervezési minta 'Builder'?
sobes.tech MI
Válasz az MI-től
A "Builder" (Építő) tervezési minta egy létrehozó minta, amely lehetővé teszi összetett objektum lépésenkénti létrehozását. Elkülöníti egy összetett objektum építési folyamatát annak reprezentációjától, lehetővé téve ugyanazon építési folyamat használatát különböző reprezentációk létrehozására.
A minta kulcsfontosságú összetevői:
- Builder: Egy absztrakt vagy konkrét interfész (vagy osztály), amely meghatározza a termék részeinek lépésenkénti felépítéséhez szükséges metódusokat.
- ConcreteBuilder: A Builder konkrét megvalósítása, amely egy adott termék reprezentációját hozza létre. Ismeri az összes építési részletet.
- Director: Egy opcionális, de gyakran használt osztály, amely meghatározza az építési lépések hívásának sorrendjét, hogy egy adott konfigurációt hozzon létre.
- Product: Az összetett objektum, amely épül. Több részből áll.
Előnyök:
- Lehetővé teszi összetett objektumok lépésenkénti létrehozását, elkerülve a "teleszkópos" konstruktorokat (sok paraméterrel rendelkező konstruktorokat).
- Inkapszulálja az összetett objektum létrehozásának logikáját.
- Könnyíti az objektum belső reprezentációjának módosítását.
- Lehetővé teszi ugyanazon építési folyamat használatát különböző termékváltozatok létrehozására.
Alkalmazási területek:
- Amikor az objektum létrehozási folyamata sok lépést foglal magában, és ezek a lépések meghatározott sorrendben kell, hogy végbemenjenek.
- Amikor ugyanazon objektum különböző reprezentációira van szükség.
- Amikor az objektum konstruktorának nagyon sok opcionális paramétere van.
Példa:
// Termék
class Pizza {
private String tészta = "";
private String szósz = "";
private List<String> feltétek = new ArrayList<>();
public void setTészta(String tészta) {
this.tészta = tészta;
}
public void setSzósz(String szósz) {
this.szósz = szósz;
}
public void addFeltét(String feltét) {
this.feltétek.add(feltét);
}
@Override
public String toString() {
return "Pizza tésztával: " + tészta + ", szósz: " + szósz + ", feltétek: " + feltétek;
}
}
// Builder interfész
interface PizzaBuilder {
void buildTészta();
void buildSzósz();
void buildFeltétek();
Pizza getPizza();
}
// Konkrét Builder
class MargheritaPizzaBuilder implements PizzaBuilder {
private Pizza pizza = new Pizza();
@Override
public void buildTészta() {
pizza.setTészta("vékony kérge");
}
@Override
public void buildSzósz() {
pizza.setSzósz("paradicsom");
}
@Override
public void buildFeltétek() {
pizza.addFeltét("mozzarella");
pizza.addFeltét("bazsalikom");
}
@Override
public Pizza getPizza() {
return this.pizza;
}
}
// Igazgató (opcionális)
class Szakács {
private PizzaBuilder pizzaBuilder;
public void setPizzaBuilder(PizzaBuilder pb) {
pizzaBuilder = pb;
}
public Pizza getPizza() {
return pizzaBuilder.getPizza();
}
public void építPizza() {
pizzaBuilder.buildTészta();
pizzaBuilder.buildSzósz();
pizzaBuilder.buildFeltétek();
}
}
// Használat
public class BuilderExample {
public static void main(String[] args) {
Szakács szakács = new Szakács();
PizzaBuilder margheritaBuilder = new MargheritaPizzaBuilder();
szakács.setPizzaBuilder(margheritaBuilder);
szakács.építPizza();
Pizza margherita = szakács.getPizza();
System.out.println(margherita);
}
}
A teszt automatizálás kontextusában a "Builder" gyakran használatos tesztadatok vagy összetett teszt objektumok (például egy sok attribútummal rendelkező felhasználói objektum, több elemet tartalmazó rendelés objektum) létrehozására, amikor rugalmasan kell konfigurálni az adatok különböző változatait különböző teszt forgatókönyvekhez.