Middle
Бунёдкор (Builder) дар контексти рушд додани нармафзор чист?
sobes.tech AI
Ҷавоб аз AI
Шаблон проектування, який відокремлює конструювання складного об'єкта від його представлення, дозволяючи створювати різні представлення одного й того самого процесу побудови.
Ключові особливості:
- Розділення відповідальності: Логіка створення об'єкта (кроки конструювання) та представлення об'єкта (кінцевий продукт) розділені.
- Покрокове конструювання: Об'єкт створюється крок за кроком, що робить процес створення більш гнучким і зрозумілим.
- Різні представлення: Один і той самий процес конструювання може використовуватися для створення різних варіацій об'єкта.
- Інкапсуляція: Деталі створення об'єкта приховані від клієнта, що спрощує його використання.
Основні учасники:
- Builder (Будівельник): Абстрактний інтерфейс або клас, який визначає кроки для створення частин продукту.
- ConcreteBuilder (Конкретний будівельник): Конкретна реалізація Будівельника, яка виконує фактичне конструювання частин продукту та зберігає результат.
- Director (Директор): Клас, який використовує об'єкт ConcreteBuilder для конструювання продукту, викликаючи відповідні методи будівельника у визначеній послідовності.
- Product (Продукт): Складний об'єкт, який будується.
Приклад використання:
Створення об'єкта Pizza з різними інгредієнтами:
// Product
class Pizza {
private String dough;
private String sauce;
private String cheese;
private List<String> toppings;
public void setDough(String dough) { this.dough = dough; }
public void setSauce(String sauce) { this.sauce = sauce; }
public void setCheese(String cheese) { this.cheese = cheese; }
public void addTopping(String topping) {
if (toppings == null) {
toppings = new ArrayList<>();
}
toppings.add(topping);
}
@Override
public String toString() {
return "Pizza with dough: " + dough + ", sauce: " + sauce + ", cheese: " + cheese + ", toppings: " + toppings;
}
}
// Builder interface
interface PizzaBuilder {
void buildDough();
void buildSauce();
void buildCheese();
void addTopping(String topping);
Pizza getResult();
}
// ConcreteBuilder
class MargheritaPizzaBuilder implements PizzaBuilder {
private Pizza pizza;
public MargheritaPizzaBuilder() {
this.pizza = new Pizza();
}
@Override
public void buildDough() {
pizza.setDough("Тонка корка");
}
@Override
public void buildSauce() {
pizza.setSauce("Томатний соус");
}
@Override
public void buildCheese() {
pizza.setCheese("Моцарела");
}
@Override
public void addTopping(String topping) {
// Margherita не має додаткових інгредієнтів за замовчуванням
}
@Override
public Pizza getResult() {
return pizza;
}
}
// Director
class Cook {
private PizzaBuilder pizzaBuilder;
public void setPizzaBuilder(PizzaBuilder pb) {
pizzaBuilder = pb;
}
public void constructPizza() {
pizzaBuilder.buildDough();
pizzaBuilder.buildSauce();
pizzaBuilder.buildCheese();
// Додаткові інгредієнти можна додати тут залежно від типу або вимог піци
}
}
// Client code
public class PizzaShop {
public static void main(String[] args) {
Cook cook = new Cook();
PizzaBuilder margheritaBuilder = new MargheritaPizzaBuilder();
cook.setPizzaBuilder(margheritaBuilder);
cook.constructPizza();
Pizza pizza = margheritaBuilder.getResult();
System.out.println(pizza);
}
}
Застосовується, коли:
- Необхідно створювати складний об'єкт з багатьма необов'язковими параметрами.
- Процес створення об'єкта є послідовним і включає багато кроків.
- Потрібно створити різні варіації одного й того самого об'єкта, використовуючи один і той самий алгоритм конструювання.
- Необхідно уникнути конструктора з великою кількістю параметрів ("телескопічний конструктор").
Переваги:
- Покращує читабельність і підтримуваність коду.
- Забезпечує гнучкість у створенні об'єктів.
- Дозволяє створювати незмінні об'єкти.
- Позбавляє від необхідності великої кількості конструкторів.
Недоліки:
- Може збільшити кількість класів у проекті (для кожного типу об'єкта та кожного будівельника).
- Вимагає деяких початкових зусиль на проектування.