Middle
Čo je Builder v kontexte návrhu softvéru?
sobes.tech AI
Odpoveď od AI
Toto je návrhový vzor, ktorý oddeľuje konštrukciu zloženého objektu od jeho prezentácie, čo umožňuje vytváranie rôznych prezentácií objektu pomocou rovnakého procesu konštrukcie.
Princíp fungovania:
- Produkt (Product): Zložitý objekt, ktorý je potrebné postaviť.
- Staviteľ (Builder): Abstraktné rozhranie pre tvorbu častí produktu.
- Konkrétny staviteľ (Concrete Builder): Implementácia rozhrania "Staviteľ", ktorá vytvára konkrétne časti produktu a ich skladá do hotového produktu.
- Riaditeľ (Director, voliteľné): Určuje sled krokov konštrukcie a používa Staviteľa na vytvorenie produktu.
Výhody:
- Umožňuje krok za krokom vytvárať zložité objekty.
- Oddelí logiku stavby objektu od samotného objektu.
- Umožňuje vytvárať rôzne prezentácie objektu rovnakým procesom.
- Uľahčuje rozšírenie pridaním nových Concrete Builderov.
Nevýhody:
- Zvyšuje počet tried kvôli potrebe vytvárania samostatných Concrete Builderov.
- Môže skomplikovať kód pre jednoduché objekty.
Príklad použitia (Java):
Predstavme si tvorbu zloženého objektu "Dom":
// 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 + '\'' +
'}';
}
}
// Staviteľ
interface HouseBuilder {
void buildWalls();
void buildRoof();
void buildWindows();
void buildDoors();
House getResult();
}
// Konkrétny staviteľ
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;
}
}
// Riaditeľ (voliteľné)
class Director {
public void constructStoneHouse(HouseBuilder builder) {
builder.buildWalls();
builder.buildRoof();
builder.buildWindows();
builder.buildDoors();
}
}
// Použitie
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'}
}
}