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" често се използва за създаване на тестови данни или сложни тестови обекти (например, потребителски обект с множество атрибути, обект на поръчка с няколко позиции), когато е необходимо гъвкаво настройване на различни варианти на тези данни за различни тестови сценарии.