Middle
Tərtibat dizayn nümunəsi 'Builder' nədir?
sobes.tech Süni İntellekt
AI-dan cavab
"Builder" (Tərtibçi) nüvəli dizayn nümunəsidir və mürəkkəb obyektlərin addım-addım yaradılması üçün nəzərdə tutulmuşdur. O, mürəkkəb obyektin qurulma prosesini onun təqdimatından ayırır ki, eyni qurma prosesi müxtəlif təqdimatların yaradılmasına imkan versin.
İş prinsipləri:
- Ayırma: Obyektin yaradılma məntiqini onun özündən ayırır.
- Vəkalət: Müştəri kodu (Direktor) obyekti ayrı bir sinfə (Tərtibçi) vəkalət edir.
- Addım-addım yaradılma: Obyekt tərkib hissələrindən tərtibçi metodları vasitəsilə yığılır.
Əsas iştirakçılar:
- Product: Yaratmaq istədiyimiz mürəkkəb obyekt. Yaradılma prosesindən asılı deyil.
- Builder: Product-in qurulması üçün addımları müəyyən edən abstrakt interfeys.
- ConcreteBuilder: Builder-in konkret tətbiqi, qurulma addımlarını həyata keçirir və hazır Product-i əldə etmək üçün metod təqdim edir.
- Director (İstəyə bağlı): Qurulma addımlarının çağırış ardıcıllığını müəyyən edir. Zəruri deyil, müştəri kodu birbaşa ConcreteBuilder ilə qarşılıqlı əlaqədə ola bilər.
Üstünlüklər:
- Çox sayda qeyri-zorunlu parametrlərlə obyektlərin daha oxunaqlı şəkildə yaradılmasına imkan verir, çoxsaylı arqumentli konstruktorlar və ya setter zəncirləri istifadə etməkdən daha yaxşıdır.
- Eyni qurma prosesi ilə müxtəlif variantlar yaratmağa imkan verir.
- Yaradılan obyektin daxili strukturunu gizlədir.
Çatışmazlıqlar:
- Layihədə sinflərin sayını artıra bilər (Builder, ConcreteBuilder, Product, Director).
İstifadə nümunəsi: Müxtəlif tərkib hissələri olan Pizza sinfi obyektinin yaradılması.
// Product
public 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 setToppings(List<String> toppings) { this.toppings = toppings; }
@Override
public String toString() {
return "Pizza with dough=" + dough + ", sauce=" + sauce + ", cheese=" + cheese + ", toppings=" + toppings;
}
}
// Builder
public interface PizzaBuilder {
void buildDough();
void buildSauce();
void buildCheese();
void addTopping(String topping);
Pizza getPizza();
}
// ConcreteBuilder
public class MargheritaPizzaBuilder implements PizzaBuilder {
private Pizza pizza;
public MargheritaPizzaBuilder() {
this.pizza = new Pizza();
this.pizza.setToppings(new ArrayList<>()); // Listənin təşkili
}
@Override
public void buildDough() {
pizza.setDough("Thin crust");
}
@Override
public void buildSauce() {
pizza.setSauce("Tomato sauce");
}
@Override
public void buildCheese() {
pizza.setCheese("Mozzarella");
}
@Override
public void addTopping(String topping) {
// Margherita əlavə toppings etmir, yalnız əsas olanlar
}
@Override
public Pizza getPizza() {
return this.pizza;
}
}
// Director (İstəyə bağlı)
public class Kitchen {
private PizzaBuilder pizzaBuilder;
public void setPizzaBuilder(PizzaBuilder pb) {
pizzaBuilder = pb;
}
public Pizza getPizza() {
return pizzaBuilder.getPizza();
}
public void constructPizza() {
pizzaBuilder.buildDough();
pizzaBuilder.buildSauce();
pizzaBuilder.buildCheese();
// Digər metodlar da çağırıla bilər, məsələn addTopping() başqa bir tərtibçi üçün
}
}
İstifadə:
// Müştəri kodu
Kitchen kitchen = new Kitchen();
PizzaBuilder margheritaBuilder = new MargheritaPizzaBuilder();
kitchen.setPizzaBuilder(margheritaBuilder);
kitchen.constructPizza();
Pizza margherita = kitchen.getPizza();
System.out.println(margherita); // Nəticə: Pizza with dough=Thin crust, sauce=Tomato sauce, cheese=Mozzarella, toppings=[]