Wat is het ontwerp patroon 'Builder'?
sobes.tech AI
Antwoord van AI
Het ontwerp patroon "Builder" (Bouwer) is een creational patroon dat een manier biedt om een complex object stapsgewijs te creëren. Het scheidt het bouwproces van het complexe object van zijn representatie, waardoor hetzelfde bouwproces gebruikt kan worden om verschillende representaties te maken.
Belangrijke componenten van het patroon:
- Builder: Abstracte of concrete interface (of klasse) die een set methoden definieert voor het stapsgewijs bouwen van de delen van het product.
- ConcreteBuilder: Concrete implementatie van Builder die een specifieke representatie van het product creëert. Kent alle details van de constructie.
- Director: Optioneel, maar vaak gebruikte klasse. Bepaalt de volgorde waarin de bouwstappen worden aangeroepen om een bepaalde configuratie van het product te maken.
- Product: Het complexe object dat wordt gebouwd. Bestaat uit vele delen.
Voordelen:
- Maakt het mogelijk om complexe objecten stapsgewijs te creëren, waardoor "telescoop"-constructors (met veel parameters) worden vermeden.
- Encapsuleert de logica van het maken van het complexe object.
- Vereenvoudigt het wijzigen van de interne representatie van het product.
- Maakt het mogelijk om hetzelfde bouwproces te gebruiken voor het maken van verschillende varianten van het product.
Toepassingsgebieden:
- Wanneer het proces van het maken van een object veel stappen omvat en deze in een bepaalde volgorde moeten worden uitgevoerd.
- Wanneer verschillende representaties van hetzelfde object nodig zijn.
- Wanneer de constructor van het object veel optionele parameters heeft.
Voorbeeld:
// Product
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 met deeg: " + dough + ", saus: " + sauce + ", toppings: " + toppings;
}
}
// Interface voor de bouwer
interface PizzaBuilder {
void buildDough();
void buildSauce();
void buildToppings();
Pizza getPizza();
}
// Concrete bouwer
class MargheritaPizzaBuilder implements PizzaBuilder {
private Pizza pizza = new Pizza();
@Override
public void buildDough() {
pizza.setDough("dunne korst");
}
@Override
public void buildSauce() {
pizza.setSauce("tomaat");
}
@Override
public void buildToppings() {
pizza.addTopping("mozzarella");
pizza.addTopping("basilicum");
}
@Override
public Pizza getPizza() {
return this.pizza;
}
}
// Directeur (optioneel)
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();
}
}
// Gebruik
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);
}
}
Test avtomatlashtirish kontekstida, "Builder" ko'pincha test ma'lumotlarini yoki murakkab test ob'ektlarini (masalan, ko'p atributlarga ega foydalanuvchi ob'ekti, bir nechta pozitsiyaga ega buyurtma ob'ekti) yaratish uchun ishlatiladi; bu esa, turli test ssenariyalari uchun bu ma'lumotlarning turli variantlarini moslashuvchan tarzda sozlashni talab qiladi.