Sobes.tech
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'}
    }
}