Sobes.tech
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:

  1. Ayırma: Obyektin yaradılma məntiqini onun özündən ayırır.
  2. Vəkalət: Müştəri kodu (Direktor) obyekti ayrı bir sinfə (Tərtibçi) vəkalət edir.
  3. 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=[]