Middle
Co je to Builder v kontextu návrhu softwaru?
sobes.tech AI
Odpověď od AI
Toto je návrhový vzor, který odděluje konstrukci složitého objektu od jeho prezentace, umožňuje vytvářet různé prezentace objektu pomocí stejného konstrukčního procesu.
Princip fungování:
- Produkt (Product): Složitý objekt, který je třeba postavit.
- Stavitel (Builder): Abstrétní rozhraní pro tvorbu částí produktu.
- Konkrétní stavitel (Concrete Builder): Implementace rozhraní "Stavitel", která vytváří konkrétní části produktu a skládá je do hotového produktu.
- Ředitel (Director, volitelné): Určuje posloupnost kroků konstrukce a používá Stavitele k vytvoření produktu.
Výhody:
- Umožňuje krok za krokem vytvářet složité objekty.
- Odděluje logiku stavby objektu od samotného objektu.
- Umožňuje vytvářet různé prezentace objektu pomocí stejného procesu.
- Usnadňuje rozšíření přidáním nových Concrete Builderů.
Nevýhody:
- Zvyšuje počet tříd kvůli nutnosti vytváření samostatných Concrete Builderů.
- Může zkomplikovat kód u jednoduchých objektů.
Příklad použití (Java):
Představme si tvorbu složitého objektu "Dům":
// Produkt
class House {
private String walls;
private String roof;
private String windows;
private String doors;
public void setWalls(String walls) { this.walls = walls; }
public void setRoof(String roof) { this.roof = roof; }
public void setWindows(String windows) { this.windows = windows; }
public void setDoors(String doors) { this.doors = doors; }
@Override
public String toString() {
return "House{" +
"walls='" + walls + '\'' +
", roof='" + roof + '\'' +
", windows='" + windows + '\'' +
", doors='" + doors + '\'' +
'}';
}
}
// Stavitel
interface HouseBuilder {
void buildWalls();
void buildRoof();
void buildWindows();
void buildDoors();
House getResult();
}
// Konkrétní stavitel
class StoneHouseBuilder implements HouseBuilder {
private House house;
public StoneHouseBuilder() {
this.house = new House();
}
@Override
public void buildWalls() {
house.setWalls("Stone Walls");
}
@Override
public void buildRoof() {
house.setRoof("Tile Roof");
}
@Override
public void buildWindows() {
house.setWindows("Wooden Windows");
}
@Override
public void buildDoors() {
house.setDoors("Solid Wooden Doors");
}
@Override
public House getResult() {
return house;
}
}
// Ředitel (volitelné)
class Director {
public void constructStoneHouse(HouseBuilder builder) {
builder.buildWalls();
builder.buildRoof();
builder.buildWindows();
builder.buildDoors();
}
}
// Použití
public class BuilderExample {
public static void main(String[] args) {
Director director = new Director();
HouseBuilder stoneHouseBuilder = new StoneHouseBuilder();
director.constructStoneHouse(stoneHouseBuilder);
House stoneHouse = stoneHouseBuilder.getResult();
System.out.println(stoneHouse); // Výstup: House{walls='Stone Walls', roof='Tile Roof', windows='Wooden Windows', doors='Solid Wooden Doors'}
}
}