Sobes.tech
Middle

Какво е патърнът за проектиране 'Builder' (Изградител)?

sobes.tech AI

Отговор от AI

Моделът "Builder" (Изградител) е създаващ шаблон за дизайн, който позволява стъпка по стъпка създаване на сложни обекти, предоставяйки различни варианти за конфигурация.

  • Назначение: Да отдели процеса на конструиране на обекта от неговото представяне. Позволява получаването на различни представяния на един и същи процес на конструиране.
  • Предимства:
    • Позволява стъпково изграждане на обект, скривайки детайлите на конструирането.
    • Улеснява създаването на обекти с голям брой опционални параметри (в противоположност на конструкторите с множество аргументи или анти-шаблона Telescoping Constructors).
    • Може да използва един и същ код за създаване на различни представяния на обекта.
  • Основни участници:
    1. Builder (Изградител): Интерфейс или абстрактен клас, който определя стъпките за изграждане на частите на обекта.
    2. ConcreteBuilder (Конкретен изградител): Реализация на интерфейса Builder, която създава конкретните части на обекта и предоставя метод за получаване на крайния резултат.
    3. Director (Директор): Определя последователността от стъпки за създаване на обекта, използвайки обекта Builder. Директорът е опционален и клиентът може да работи директно с Изградителя.
    4. Product (Продукт): Обектът, който се изгражда.

Пример за структура (Java):

// Продукт
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 + "]";
    }
}

// Интерфейс Builder
interface CarBuilder {
    void buildEngine();
    void buildWheels();
    void buildColor();
    Car getResult();
}

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

// Директор (по избор)
class CarDirector {
    private CarBuilder builder;

    public CarDirector(CarBuilder builder) {
        this.builder = builder;
    }

    public void constructCar() {
        builder.buildEngine();
        builder.buildWheels();
        builder.buildColor();
    }
}

// Клиентско използване
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("Изградена кола: " + sportsCar);

        // Директна употреба без Директор
        CarBuilder anotherSportsCarBuilder = new SportsCarBuilder();
        anotherSportsCarBuilder.buildEngine();
        anotherSportsCarBuilder.buildColor(); // Без колела
        Car partialCar = anotherSportsCarBuilder.getResult();
        System.out.println("Частично изградена кола: " + partialCar);
    }
}