Middle
Čo je návrhový vzor 'Builder' (Staviteľ)?
sobes.tech AI
Odpoveď od AI
Vzor "Staviteľ" (Builder) je tvorivý vzor návrhu, ktorý umožňuje krok za krokom vytvárať zložité objekty a poskytuje rôzne možnosti konfigurácie.
- Účel: Oddeliť proces konštrukcie objektu od jeho prezentácie. Umožňuje získať rôzne prezentácie toho istého procesu konštrukcie.
- Výhody:
- Umožňuje krok za krokom stavať objekt, skrývať detaily konštrukcie.
- Uľahčuje vytváranie objektov s veľkým počtom voliteľných parametrov (na rozdiel od konštruktorov s množstvom argumentov alebo anti-vzor Telescoping Constructors).
- Môže použiť rovnaký kód konštrukcie na vytvorenie rôznych prezentácií objektu.
- Hlavní účastníci:
- Builder (Staviteľ): Rozhranie alebo abstraktná trieda definujúca kroky konštrukcie častí objektu.
- ConcreteBuilder (Konkrétny staviteľ): Implementácia rozhrania Builder, ktorá vytvára konkrétne časti objektu a poskytuje metódu na získanie konečného výsledku.
- Director (Riaditeľ): Určuje sled krokov na vytvorenie objektu pomocou objektu Builder. Riaditeľ je voliteľný a klient môže pracovať priamo so Staviteľom.
- Product (Produkt): Objekt, ktorý sa stavia.
Príklad štruktúry (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 + "]";
}
}
// Rozhranie Builder
interface CarBuilder {
void buildEngine();
void buildWheels();
void buildColor();
Car getResult();
}
// Konkrétny 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;
}
}
// Riaditeľ (Voliteľný)
class CarDirector {
private CarBuilder builder;
public CarDirector(CarBuilder builder) {
this.builder = builder;
}
public void constructCar() {
builder.buildEngine();
builder.buildWheels();
builder.buildColor();
}
}
// Používateľ
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("Postavené auto: " + sportsCar);
// Priamy prístup bez Riaditeľa
CarBuilder anotherSportsCarBuilder = new SportsCarBuilder();
anotherSportsCarBuilder.buildEngine();
anotherSportsCarBuilder.buildColor(); // Bez kolies
Car partialCar = anotherSportsCarBuilder.getResult();
System.out.println("Čiastočne postavené auto: " + partialCar);
}
}