Sobes.tech
Middle

Kas yra projektavimo šablonas 'Statytojas' (Builder)?

sobes.tech AI

Atsakymas iš AI

„Kūrėjo“ (Builder) modelis yra kūrybinis projektavimo modelis, leidžiantis kurti sudėtingus objektus žingsnis po žingsnio, siūlant įvairias konfigūracijos galimybes.

  • Paskirtis: atskirti objekto konstravimo procesą nuo jo pateikimo. leidžia gauti skirtingus to paties konstravimo proceso vaizdus.
  • Privalumai:
    • leidžia žingsnis po žingsnio kurti objektą, paslėpiant konstravimo detales.
    • palengvina objektų kūrimą su daugybe neprivalomų parametrų (skirtingai nuo konstruktorių su daugybe argumentų arba antipatterno Telescoping Constructors).
    • galima naudoti tą pačią konstravimo kodo dalį skirtingų objekto vaizdų kūrimui.
  • Pagrindiniai dalyviai:
    1. Builder (Kūrėjas): sąsaja arba abstrakti klasė, apibrėžianti objekto dalių konstravimo žingsnius.
    2. ConcreteBuilder (Konkretaus Kūrėjo): Builder sąsajos įgyvendinimas, kuris kuria konkrečias objekto dalis ir teikia galimybę gauti galutinį rezultatą.
    3. Director (Vadovas): nustato žingsnių seką objekto kūrimui, naudojant Builder objektą. Vadovas nėra būtinas, ir klientas gali dirbti tiesiogiai su Kūrėju.
    4. Product (Produktas): vaizduojamas objektas, kuris yra kuriamas.

Struktūros pavyzdys (Java):

// Produktas
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 + "]";
    }
}

// Kūrėjo sąsaja
interface CarBuilder {
    void buildEngine();
    void buildWheels();
    void buildColor();
    Car getResult();
}

// Konkretaus Kūrėjo
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;
    }
}

// Vadovas (pasirinktinai)
class CarDirector {
    private CarBuilder builder;

    public CarDirector(CarBuilder builder) {
        this.builder = builder;
    }

    public void constructCar() {
        builder.buildEngine();
        builder.buildWheels();
        builder.buildColor();
    }
}

// Kliento naudojimas
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("Sukurtas automobilis: " + sportsCar);

        // Tiesioginis naudojimas be Direktoriaus
        CarBuilder anotherSportsCarBuilder = new SportsCarBuilder();
        anotherSportsCarBuilder.buildEngine();
        anotherSportsCarBuilder.buildColor(); // Be ratų
        Car partialCar = anotherSportsCarBuilder.getResult();
        System.out.println("Sukurtas dalinis automobilis: " + partialCar);
    }
}