Middle
Czym jest wzorzec projektowy 'Budowniczy' (Builder)?
sobes.tech AI
Odpowiedź od AI
Wzorzec "Builder" (Budowniczy) jest wzorcem kreacyjnym, który umożliwia tworzenie złożonych obiektów krok po kroku, zapewniając różne opcje konfiguracji.
- Cel: Oddzielenie procesu konstruowania obiektu od jego reprezentacji. Umożliwia uzyskanie różnych reprezentacji tego samego procesu konstruowania.
- Zalety:
- Pozwala na stopniowe budowanie obiektu, ukrywając szczegóły konstrukcji.
- Ułatwia tworzenie obiektów z dużą liczbą parametrów opcjonalnych (w przeciwieństwie do konstruktorów z wieloma argumentami lub anty-wzorca Telescoping Constructors).
- Ten sam kod konstrukcji można użyć do tworzenia różnych reprezentacji obiektu.
- Główni uczestnicy:
- Builder (Budowniczy): Interfejs lub klasa abstrakcyjna definiująca kroki budowy części obiektu.
- ConcreteBuilder (Konkretna Budowniczy): Implementacja interfejsu Builder, tworząca konkretne części obiektu i zapewniająca metodę do uzyskania końcowego wyniku.
- Director (Reżyser): Określa sekwencję kroków do tworzenia obiektu, korzystając z obiektu Builder. Reżyser jest opcjonalny, a klient może pracować bezpośrednio z Budowniczym.
- Product (Produkt): Obiekt, który jest konstruowany.
Przykład struktury (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 + "]";
}
}
// Interfejs Budowniczy
interface CarBuilder {
void buildEngine();
void buildWheels();
void buildColor();
Car getResult();
}
// Konkretna Budowniczy
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;
}
}
// Reżyser (Opcjonalny)
class CarDirector {
private CarBuilder builder;
public CarDirector(CarBuilder builder) {
this.builder = builder;
}
public void constructCar() {
builder.buildEngine();
builder.buildWheels();
builder.buildColor();
}
}
// Użycie klienta
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);
// Bezpośrednie użycie bez Reżysera
CarBuilder anotherSportsCarBuilder = new SportsCarBuilder();
anotherSportsCarBuilder.buildEngine();
anotherSportsCarBuilder.buildColor(); // Budowa bez kół
Car partialCar = anotherSportsCarBuilder.getResult();
System.out.println("Built partial car: " + partialCar);
}
}