Sobes.tech
Middle

Qurilish dizayn shabloni 'Builder' nima?

sobes.tech AI

AIdan javob

"Builder" (Quruvchi) dizayn naqshidir, u murakkab ob' objectni bosqichma-bosqich yaratish usulini taqdim etadi. U murakkab ob' objectning qurilish jarayonini uning tasviridan ajratadi, bu esa turli xil tasvirlarni yaratish uchun bir xil qurilish jarayonidan foydalanishga imkon beradi.

Naqshning asosiy komponentlari:

  • Builder: Ob'ektning bosqichma-bosqich qismlarini qurish uchun metodlar to'plamini belgilovchi abstrakt yoki konkret interfeys (yoki sinf).
  • ConcreteBuilder: Maxsus ob'ektni yaratadigan Builder ning konkret amalga oshirilishi. U qurilish tafsilotlarini biladi.
  • Director: Opsiyonel, ammo ko'pincha ishlatiladigan sinf. U ob'ektning ma'lum bir konfiguratsiyasini yaratish uchun qurilish bosqichlarini chaqirish tartibini belgilaydi.
  • Product: Qurilayotgan murakkab ob'ekt. U ko'plab qismlardan iborat.

Afzalliklar:

  • Murakkab ob'ektlarni bosqichma-bosqich yaratishga imkon beradi, "teleskopik" konstruktorlardan (ko'p parametrli konstruktorlar) qochadi.
  • Murakkab ob'ektni yaratish logikasini inkapsulyatsiya qiladi.
  • Mahsulotning ichki tasvirini o'zgartirishni osonlashtiradi.
  • Bir xil qurilish jarayonidan foydalanib, turli xil mahsulot variantlarini yaratishga imkon beradi.

Qo'llanilishi:

  • Ob'ektni yaratish jarayoni ko'plab bosqichlarni o'z ichiga olgan va bu bosqichlar ma'lum bir tartibda bajarilishi kerak bo'lsa.
  • Bir xil ob'ektning turli xil tasvirlariga ega bo'lish zarur bo'lsa.
  • Ob'ekt konstruktorining juda ko'p ixtiyoriy parametrlariga ega bo'lsa.

Misol:

// Mahsulot
class Pizza {
    private String dough = "";
    private String sauce = "";
    private List<String> toppings = new ArrayList<>();

    public void setDough(String dough) {
        this.dough = dough;
    }

    public void setSauce(String sauce) {
        this.sauce = sauce;
    }

    public void addTopping(String topping) {
        this.toppings.add(topping);
    }

    @Override
    public String toString() {
        return "Pizza xamiri bilan: " + dough + ", sous bilan: " + sauce + ", qo'shimchalar: " + toppings;
    }
}

// Quruvchi interfeysi
interface PizzaBuilder {
    void buildDough();
    void buildSauce();
    void buildToppings();
    Pizza getPizza();
}

// Konkret quruvchi
class MargheritaPizzaBuilder implements PizzaBuilder {
    private Pizza pizza = new Pizza();

    @Override
    public void buildDough() {
        pizza.setDough("yog'och qobiq");
    }

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

    @Override
    public void buildToppings() {
        pizza.addTopping("mozzarella");
        pizza.addTopping("basil");
    }

    @Override
    public Pizza getPizza() {
        return this.pizza;
    }
}

// Direktor (opsiyonel)
class Cook {
    private PizzaBuilder pizzaBuilder;

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

    public Pizza getPizza() {
        return pizzaBuilder.getPizza();
    }

    public void constructPizza() {
        pizzaBuilder.buildDough();
        pizzaBuilder.buildSauce();
        pizzaBuilder.buildToppings();
    }
}

// Foydalanish
public class BuilderExample {
    public static void main(String[] args) {
        Cook cook = new Cook();
        PizzaBuilder margheritaBuilder = new MargheritaPizzaBuilder();

        cook.setPizzaBuilder(margheritaBuilder);
        cook.constructPizza();

        Pizza margherita = cook.getPizza();
        System.out.println(margherita);
    }
}

Test avtomatizatsiyasi kontekstida, "Builder" ko'pincha test ma'lumotlarini yoki murakkab test ob'ektlarini (masalan, ko'p atributlarga ega foydalanuvchi ob'ekti, bir nechta pozitsiyaga ega buyurtma ob'ekti) yaratish uchun ishlatiladi; bu esa, turli test ssenariyalari uchun bu ma'lumotlarning turli variantlarini moslashuvchan tarzda sozlashni talab qiladi.