Middle
Wat is het ontwerp patroon 'Builder' (Bouwer)?
sobes.tech AI
Antwoord van AI
Het "Builder"-patroon (Bouwer) is een creational design pattern dat het mogelijk maakt om complexe objecten stapsgewijs te creëren, met verschillende configuratie-opties.
- Doel: Het bouwproces van een object scheiden van de representatie ervan. Het maakt het mogelijk om verschillende representaties van hetzelfde bouwproces te verkrijgen.
- Voordelen:
- Maakt het mogelijk om een object stapsgewijs te bouwen, waarbij de details van de constructie verborgen blijven.
- Vereenvoudigt het maken van objecten met veel optionele parameters (in tegenstelling tot constructors met meerdere argumenten of het anti-patroon Telescoping Constructors).
- Dezelfde bouwcode kan worden gebruikt om verschillende representaties van het object te maken.
- Belangrijke deelnemers:
- Builder (Bouwer): Interface of abstracte klasse die de stappen definieert voor het bouwen van de delen van het object.
- ConcreteBuilder (Concrete Bouwer): Implementatie van de Builder-interface die specifieke delen van het object creëert en een methode biedt om het uiteindelijke resultaat te verkrijgen.
- Director (Regisseur): Bepaalt de volgorde van stappen voor het maken van het object, gebruikmakend van een Builder-object. De Regisseur is optioneel en de klant kan direct met de Bouwer werken.
- Product (Product): Het object dat wordt gebouwd.
Voorbeeldstructuur (Java):
// Product
class Car {
private String engine;
private int wheels;
private String color;
public void setEngine(String engine) {
this.engine = engine;
}
public void setWheels(int wheels) {
this.wheels = wheels;
}
public void setColor(String color) {
this.color = color;
}
@Override
public String toString() {
return "Car [engine=" + engine + ", wheels=" + wheels + ", color=" + color + "]";
}
}
// Builder-interface
interface CarBuilder {
void buildEngine();
void buildWheels();
void buildColor();
Car getResult();
}
// ConcreteBuilder
class SportsCarBuilder implements CarBuilder {
private Car car = new Car();
@Override
public void buildEngine() {
car.setEngine("V8");
}
@Override
public void buildWheels() {
car.setWheels(4);
}
@Override
public void buildColor() {
car.setColor("Red");
}
@Override
public Car getResult() {
return car;
}
}
// Director (Optioneel)
class CarDirector {
private CarBuilder builder;
public CarDirector(CarBuilder builder) {
this.builder = builder;
}
public void constructCar() {
builder.buildEngine();
builder.buildWheels();
builder.buildColor();
}
}
// Clientgebruik
public class Client {
public static void main(String[] args) {
CarBuilder sportsCarBuilder = new SportsCarBuilder();
CarDirector director = new CarDirector(sportsCarBuilder);
director.constructCar();
Car sportsCar = sportsCarBuilder.getResult();
System.out.println("Gebouwde auto: " + sportsCar);
// Direct gebruik zonder Director
CarBuilder anotherSportsCarBuilder = new SportsCarBuilder();
anotherSportsCarBuilder.buildEngine();
anotherSportsCarBuilder.buildColor(); // Bouwen zonder wielen
Car partialCar = anotherSportsCarBuilder.getResult();
System.out.println("Gedeeltelijke auto: " + partialCar);
}
}