Sobes.tech
Middle

Dasturlashda quruvchi (Builder) nima?

sobes.tech AI

AIdan javob

Murakkab ob'ektni qurish jarayonidan ajratadigan va bir xil qurilish jarayonining turli xil tasvirlarini yaratishga imkon beradigan dizayn shabloni.

Asosiy xususiyatlar:

  • Mas'uliyatlarni ajratish: Ob'ektni yaratish mantiqi (qadamlar) va ob'ektning tasviri (natija) ajratilgan.
  • Qadam-baqadam qurilish: Ob'ekt qadam-baqadam quriladi, bu jarayonni yanada moslashuvchan va tushunarli qiladi.
  • Turli tasvirlar: Bir xil qurilish jarayoni ob'ektning turli xil variatsiyalarini yaratish uchun ishlatilishi mumkin.
  • Kapsüllash: Ob'ektni yaratish tafsilotlari mijozdan yashiriladi, bu esa uni foydalanishni soddalashtiradi.

Asosiy ishtirokchilar:

  • Builder (Quruvchi): Mahsulotning qismlarini yaratish uchun qadamlarni belgilovchi abstrakt interfeys yoki sinf.
  • ConcreteBuilder (Aniq Quruvchi): Mahsulot qismlarini haqiqiy tarzda quradigan va natijani saqlovchi quruvchi amalga oshirilishi.
  • Director (Direktor): ConcreteBuilder ob'ektidan foydalanib, mahsulotni quradigan va muayyan ketma-ketlikda mos metodlarni chaqiradigan sinf.
  • Product (Mahsulot): Qurilayotgan murakkab ob'ekt.

Misol:

Turli ingredientlar bilan Pizza ob'ektini yaratish:

// Mahsulot
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 xamiri: " + dough + ", sous: " + sauce + ", pishloq: " + cheese + ", qo'shimchalar: " + 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("Yumshoq xamir");
    }

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

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

    @Override
    public void addTopping(String topping) {
        // Margherita uchun qo'shimcha qo'shimchalar odatda yo'q
    }

    @Override
    public Pizza getResult() {
        return pizza;
    }
}

// Direktor
class Cook {
    private PizzaBuilder pizzaBuilder;

    public void setPizzaBuilder(PizzaBuilder pb) {
        pizzaBuilder = pb;
    }

    public void constructPizza() {
        pizzaBuilder.buildDough();
        pizzaBuilder.buildSauce();
        pizzaBuilder.buildCheese();
        // Qo'shimcha qo'shimchalar pizza turi yoki talablariga qarab qo'shilishi mumkin
    }
}

// Mijoz kodi
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);
    }
}

Qo'llaniladi:

  • Murakkab ob'ektni, ko'plab ixtiyoriy parametrlar bilan yaratish zarur bo'lsa.
  • Ob'ektni yaratish jarayoni ketma-ket va ko'plab bosqichlarni o'z ichiga olsa.
  • Bir xil qurilish algoritmi yordamida ob'ektning turli xil variatsiyalarini yaratish zarur bo'lsa.
  • "Telescoping constructor" (kattalashtirilgan konstruktor) bilan konstruktorlardan qochish zarur bo'lsa.

Afzalliklari:

  • Kodning o'qilishi va saqlanishini yaxshilaydi.
  • Ob'ektlarni yaratishda moslashuvchanlikni ta'minlaydi.
  • O'zgarmas ob'ektlarni yaratishga imkon beradi.
  • Ko'p konstruktorlar ehtiyojini bartaraf qiladi.

Kamchiliklari:

  • Loyihada sinflar sonini oshirishi mumkin (har turdagi ob'ekt va har konstruktor uchun).
  • Dastlabki dizayn uchun qo'shimcha harakat talab qiladi.