Middle
Was ist das Entwurfsmuster 'Builder' (Builder)?
sobes.tech KI
Antwort von AI
Das Muster "Builder" (Builder) ist ein Erzeugungsmuster im Software-Design, das die schrittweise Erstellung komplexer Objekte ermöglicht und verschiedene Konfigurationsmöglichkeiten bietet.
- Zweck: Den Bauprozess eines Objekts vom dessen Darstellung zu trennen. Es ermöglicht, verschiedene Darstellungen desselben Bauprozesses zu erhalten.
- Vorteile:
- Ermöglicht den schrittweisen Aufbau eines Objekts, wobei die Details der Konstruktion verborgen bleiben.
- Erleichtert die Erstellung von Objekten mit vielen optionalen Parametern (im Gegensatz zu Konstruktoren mit vielen Argumenten oder dem Anti-Pattern Telescoping Constructors).
- Der gleiche Baucode kann verwendet werden, um verschiedene Darstellungen des Objekts zu erstellen.
- Hauptbeteiligte:
- Builder (Builder): Schnittstelle oder abstrakte Klasse, die die Schritte zum Aufbau der Teile des Objekts definiert.
- ConcreteBuilder (Konkreter Builder): Implementierung der Builder-Schnittstelle, die spezifische Teile des Objekts erstellt und eine Methode zum Erhalt des Endergebnisses bereitstellt.
- Director (Direktor): Bestimmt die Reihenfolge der Schritte zur Erstellung des Objekts unter Verwendung eines Builder-Objekts. Der Direktor ist optional, und der Kunde kann direkt mit dem Builder arbeiten.
- Product (Produkt): Das zu bauende Objekt.
Beispielstruktur (Java):
// Produkt
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-Schnittstelle
interface CarBuilder {
void buildEngine();
void buildWheels();
void buildColor();
Car getResult();
}
// Konkreter Builder
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 (Optional)
class CarDirector {
private CarBuilder builder;
public CarDirector(CarBuilder builder) {
this.builder = builder;
}
public void constructCar() {
builder.buildEngine();
builder.buildWheels();
builder.buildColor();
}
}
// Client-Nutzung
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("Built car: " + sportsCar);
// Direkte Nutzung ohne Director
CarBuilder anotherSportsCarBuilder = new SportsCarBuilder();
anotherSportsCarBuilder.buildEngine();
anotherSportsCarBuilder.buildColor(); // Bau ohne Räder
Car partialCar = anotherSportsCarBuilder.getResult();
System.out.println("Built partial car: " + partialCar);
}
}