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:
- Builder (Kūrėjas): sąsaja arba abstrakti klasė, apibrėžianti objekto dalių konstravimo žingsnius.
- ConcreteBuilder (Konkretaus Kūrėjo): Builder sąsajos įgyvendinimas, kuris kuria konkrečias objekto dalis ir teikia galimybę gauti galutinį rezultatą.
- 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.
- 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);
}
}