Sobes.tech
Middle

Qurilish dizayn shabloni 'Builder' nima?

sobes.tech AI

AIdan javob

"Builder" (Quruvchi) naqsh, murakkab obyektlarni bosqichma-bosqich yaratish uchun mo'ljallangan yaratuvchi dizayn naqshidir. U murakkab obyektni qurish jarayonini uning tasviridan ajratadi, shunda bir xil qurish jarayoni turli xil tasvirlarni yaratishi mumkin.

Ishlash prinsiplari:

  1. Ajratish: Ob'ektni yaratish logikasini ob'ektning o'zidan ajratadi.
  2. Vekil berish: Mijoz kodi (Director) ob'ektni yaratishni alohida sinfga (Builder) vekil qiladi.
  3. Bosqichma-bosqich qurish: Ob'ekt quruvchining metodlar to'plami yordamida komponentlardan yig'iladi.

Asosiy ishtirokchilar:

  • Product: Biz qurmoqchi bo'lgan murakkab obyekt. U yaratish jarayoniga bog'liq emas.
  • Builder: Productni qurish uchun qadamlarni belgilovchi abstrakt interfeys.
  • ConcreteBuilder: Builderning aniq amalga oshirilishi, qurish qadamlarini bajaradi va tayyor Productni olish uchun metod taqdim etadi.
  • Director (Ixtiyoriy): Qurish qadamlarini chaqirish tartibini belgilaydi. Zorur emas, mijoz kodi to'g'ridan-to'g'ri ConcreteBuilder bilan ishlashi mumkin.

Afzalliklar:

  • Ko'p miqdordagi ixtiyoriy parametrlar bilan obyektlarni, ko'p argumentli konstruktorlar yoki setter zanjirlari yordamida yaratishdan ko'ra, o'qilishi osonroq qilish imkonini beradi.
  • Bir xil qurish jarayonidan foydalanib, turli xil variatsiyalarni yaratishga imkon beradi.
  • Yaratilayotgan obyektning ichki tuzilishini yashiradi.

Kamchiliklar:

  • Loyihada sinflar sonini oshirishi mumkin (Builder, ConcreteBuilder, Product, Director).

Foydalanish misoli: Turli ingredientlar bilan Pizza sinfidan obyekt yaratish.

// 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 bilan xamir=" + dough + ", sous=" + sauce + ", pishloq=" + cheese + ", qo'shimchalar=" + 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<>()); // Ro'yxatni boshlash
    }

    @Override
    public void buildDough() {
        pizza.setDough("Yumshoq xamir");
    }

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

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

    @Override
    public void addTopping(String topping) {
        // Margherita faqat asosiy qo'shimchalarni qo'shadi
    }

    @Override
    public Pizza getPizza() {
        return this.pizza;
    }
}
// Director (Ixtiyoriy)
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();
        // Boshqa metodlar chaqirilishi mumkin, masalan addTopping() boshqa builderda
    }
}

Foydalanish:

// Mijoz kodi
Kitchen kitchen = new Kitchen();
PizzaBuilder margheritaBuilder = new MargheritaPizzaBuilder();

kitchen.setPizzaBuilder(margheritaBuilder);

kitchen.constructPizza();

Pizza margherita = kitchen.getPizza();
System.out.println(margherita); // Chiqish: Pizza bilan xamir=Yumshoq xamir, sous=Pomidor sousi, pishloq=Mozzarella, qo'shimchalar=[]