Sobes.tech
Middle

Proqram təminatı inkişafı kontekstində builder (yaradıcı) nədir?

sobes.tech Süni İntellekt

AI-dan cavab

Dərinlikli obyektin qurulmasını onun təqdimatından ayıran və eyni inşaat prosesinin müxtəlif təqdimatlarını yaratmağa imkan verən dizayn nümunəsi.

Əsas xüsusiyyətlər:

  • Məsuliyyətlərin bölünməsi: Obyektin yaradılması (quruluş addımları) və obyektin təqdimatı (nəticə məhsulu) ayrıdır.
  • Addım-addım quruluş: Obyekt addım-addım qurulur, bu da prosesi daha çevik və anlaşılan edir.
  • Fərqli təqdimatlar: Eyni quruluş prosesi müxtəlif obyekt variantlarının yaradılmasında istifadə oluna bilər.
  • İnkapsulyasiya: Obyektin yaradılmasının detalları müştəridən gizlidir, bu da onun istifadəsini sadələşdirir.

Əsas iştirakçılar:

  • Builder (Tərtibçi): Məhsulun hissələrinin yaradılması üçün addımları müəyyən edən abstrakt interfeys və ya sinif.
  • ConcreteBuilder (Möhkəm Tərtibçi): Məhsulun hissələrini faktiki olaraq tərtib edən və nəticəni saxlayan konkret tərtibçi.
  • Director (İdarəçi): ConcreteBuilder obyektindən istifadə edərək məhsulu tərtib edən və müvafiq metodları müəyyən ardıcıllıqla çağıran sinif.
  • Product (Məhsul): Yaradılan mürəkkəb obyekt.

İstifadə nümunəsi:

Fərqli tərkib hissələri olan Pizza obyektinin yaradılması:

// Məhsul
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 interfeysi
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("İncə xəmər");
    }

    @Override
    public void buildSauce() {
        pizza.setSauce("Pomidor sousu");
    }

    @Override
    public void buildCheese() {
        pizza.setCheese("Mozzarella");
    }

    @Override
    public void addTopping(String topping) {
        // Margherita əlavə toppings olmadan hazırlanır
    }

    @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();
        // Əlavə toppings burada pizza növü və tələblərə əsasən əlavə oluna bilər
    }
}

// Müştəri kodu
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);
    }
}

İstifadə halları:

  • Çox sayda qeyri-zorunlu parametrə malik mürəkkəb obyekt yaratmaq lazımdır.
  • Yaratma prosesi ardıcıl və çox addımlı olur.
  • Eyni algoritm istifadə edilərək eyni obyektin müxtəlif variantları yaradılmalıdır.
  • "Telescoping constructor" (uzanan konstruktor) istifadə etməkdən qaçınmaq lazımdır.

Üstünlüklər:

  • Kodun oxunaqlığını və saxlanmasını yaxşılaşdırır.
  • Obyektlərin yaradılmasında çeviklik təmin edir.
  • Dəyişməz obyektlərin yaradılmasına imkan verir.
  • Çox sayda konstruktorun qarşısını alır.

Çətinliklər:

  • Layihədə siniflərin sayını artıra bilər (hər obyekt tipi və hər tərtibçi üçün).
  • Əvvəlcədən dizayn üçün müəyyən səy tələb edir.