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:
- Ajratish: Ob'ektni yaratish logikasini ob'ektning o'zidan ajratadi.
- Vekil berish: Mijoz kodi (Director) ob'ektni yaratishni alohida sinfga (Builder) vekil qiladi.
- 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=[]