Sobes.tech
Middle

Какво е патърнът за дизайн 'Builder'?

sobes.tech AI

Отговор от AI

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

Ключови компоненти на модела:

  • Builder: Абстрактен или конкретен интерфейс (или клас), който определя набор от методи за стъпково изграждане на части от продукта.
  • ConcreteBuilder: Конкретна реализация на Builder, която създава специфично представяне на продукта. Знае всички детайли на изграждането.
  • Director: Опционален, но често използван клас. Определя реда на извикване на стъпките на изграждане, за да създаде определена конфигурация на продукта.
  • Product: Сложен обект, който се изгражда. Състои се от множество части.

Предимства:

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

Приложения:

  • Когато процесът на създаване на обект включва много стъпки и тези стъпки трябва да се изпълняват в определен ред.
  • Когато е необходимо да имате различни представяния на един и същ обект.
  • Когато конструкторът на обекта има много опционални параметри.

Пример:

// Продукт
class Pizza {
    private String тесто = "";
    private String сос = "";
    private List<String> топинги = new ArrayList<>();

    public void setТесто(String тесто) {
        this.тесто = тесто;
    }

    public void setСос(String сос) {
        this.сос = сос;
    }

    public void addТопинг(String топинг) {
        this.топинги.add(топинг);
    }

    @Override
    public String toString() {
        return "Пица с тесто: " + тесто + ", сос: " + сос + ", топинги: " + топинги;
    }
}

// Интерфейс на строителя
interface PizzaBuilder {
    void buildТесто();
    void buildСос();
    void buildТопинги();
    Pizza getPizza();
}

// Конкретен строител
class MargheritaPizzaBuilder implements PizzaBuilder {
    private Pizza pizza = new Pizza();

    @Override
    public void buildТесто() {
        pizza.setТесто("тънко тесто");
    }

    @Override
    public void buildСос() {
        pizza.setСос("домати");
    }

    @Override
    public void buildТопинги() {
        pizza.addТопинг("моцарела");
        pizza.addТопинг("босилек");
    }

    @Override
    public Pizza getPizza() {
        return this.pizza;
    }
}

// Директор (по избор)
class Готвач {
    private PizzaBuilder pizzaBuilder;

    public void setPizzaBuilder(PizzaBuilder pb) {
        pizzaBuilder = pb;
    }

    public Pizza getPizza() {
        return pizzaBuilder.getPizza();
    }

    public void конструирайПица() {
        pizzaBuilder.buildТесто();
        pizzaBuilder.buildСос();
        pizzaBuilder.buildТопинги();
    }
}

// Използване
public class BuilderExample {
    public static void main(String[] args) {
        Готвач готвач = new Готвач();
        PizzaBuilder margheritaBuilder = new MargheritaPizzaBuilder();

        готвач.setPizzaBuilder(margheritaBuilder);
        готвач.конструирайПица();

        Pizza пицаМаргарита = готвач.getPizza();
        System.out.println(пицаМаргарита);
    }
}

В контекста на автоматизацията на тестовете, "Builder" често се използва за създаване на тестови данни или сложни тестови обекти (например, потребителски обект с множество атрибути, обект на поръчка с няколко позиции), когато е необходимо гъвкаво настройване на различни варианти на тези данни за различни тестови сценарии.