Sobes.tech
Middle

Šta je Builder u kontekstu projektovanja softvera?

sobes.tech АИ

Одговор од АИ

Ово је образац дизајна који одваја изградњу сложеног објекта од његове презентације, омогућавајући стварање различитих презентација објекта коришћењем истог процеса изградње.

Принцип рада:

  • Производ (Product): Сложен објекат који треба изградити.
  • Градитељ (Builder): Апстрактни интерфејс за креирање делова производа.
  • Конкретни градитељ (Concrete Builder): Реализација интерфејса "Градитељ", која креира конкретне делове производа и их саставља у готов производ.
  • Директор (Director, опциони): Одређује редослед корака изградње и користи Градитеља за креирање производа.

Предности:

  • Омогућава корак по корак креирање сложених објеката.
  • Одваја логику изградње објекта од самог објекта.
  • Омогућава креирање различитих презентација објекта истим процесом.
  • Олакшава проширење додавањем нових Конкретних Градитеља.

Недостаци:

  • Повећава број класа због потребе за креирањем посебних Конкретних Градитеља.
  • Може компликовати код за једноставне објекте.

Пример употребе (Java):

Замислите креирање сложеног објекта "Кућа":

// Производ
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 + '\'' +
               '}';
    }
}

// Градитељ
interface HouseBuilder {
    void buildWalls();
    void buildRoof();
    void buildWindows();
    void buildDoors();
    House getResult();
}

// Конкретни Градитељ
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;
    }
}

// Директор (опциони)
class Director {
    public void constructStoneHouse(HouseBuilder builder) {
        builder.buildWalls();
        builder.buildRoof();
        builder.buildWindows();
        builder.buildDoors();
    }
}

// Коришћење
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); // Излаз: House{walls='Stone Walls', roof='Tile Roof', windows='Wooden Windows', doors='Solid Wooden Doors'}
    }
}