Sobes.tech
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:
    1. Builder (Budowniczy): Interfejs lub klasa abstrakcyjna definiująca kroki budowy części obiektu.
    2. ConcreteBuilder (Konkretna Budowniczy): Implementacja interfejsu Builder, tworząca konkretne części obiektu i zapewniająca metodę do uzyskania końcowego wyniku.
    3. 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.
    4. 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);
    }
}