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.