Middle
Түзүүчү дизайн үлгүсү 'Builder' эмне?
sobes.tech AI
AIден жооп
«Курулушчу» (Builder) паттерни — бул — кыйын объекттерди кадам-кадам түзүү үчүн арналган жаратуу паттерни. Ал кыйын объекттин куруу процесси менен анын көрүнүшүн бөлүп турат, ошондуктан бир эле куруу процесси ар кандай көрүнүштөрдү түзө алат.
Иштөө принциптери:
- Бөлүү: Объекттин түзүү логикасын өзү объекттен бөлүп турат.
- Өткөрүү: Кардар коду (Director) объект түзүүнү өзүнчө класска (Builder) өткөрүп берет.
- Кадам-кадам түзүү: Объект түзүүчү методдордун топтому аркылуу компоненттерден жыйналат.
Негизги катышуучулар:
- Product: Биз түзгүбүз келген кыйын объект. Ал түзүү процесси менен байланышы жок.
- Builder: Абстракт интерфейс, ал Product түзүү үчүн кадамдарды аныктайт.
- ConcreteBuilder: конкреттүү ишке ашыруу, ал кадамдарды ишке ашырып, даяр продукт алуу үчүн методду камсыз кылат.
- Director (опционалдуу): түзүү кадамдарынын тартибин аныктайт. Кардар коду турак эле ConcreteBuilder менен иштеше алат.
Артыкчылыктары:
- көптөгөн милдеттүү параметрлери бар объекттерди окшош көрүнүштө түзүүгө мүмкүндүк берет, көптөгөн аргументтери бар конструкторлор же сейтектер цепочкасы менен салыштырганда.
- бир эле процессти колдонуп, бир нече түрдүү объект вариацияларын түзүүгө мүмкүндүк берет.
- түзүлүп жаткан объекттин ички түзүмүн жашыра алат.
Кемчиликтери:
- долбоордо класстардын санын көбөйтүшү мүмкүн (Builder, ConcreteBuilder, Product, Director).
Колдонуу мисалы: Pizza классынын объектин ар кандай ингредиенттер менен түзүү:
// Продукт
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 with dough=" + dough + ", sauce=" + sauce + ", cheese=" + cheese + ", toppings=" + 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<>()); // Топпингдердин тизмесин баштоо
}
@Override
public void buildDough() {
pizza.setDough("Тонкая кабык");
}
@Override
public void buildSauce() {
pizza.setSauce("Помидор соус");
}
@Override
public void buildCheese() {
pizza.setCheese("Моцарелла");
}
@Override
public void addTopping(String topping) {
// Маргарита башка топпингдерди кошпойт, негизгилерден башка
}
@Override
public Pizza getPizza() {
return this.pizza;
}
}
// Director (опционалдуу)
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();
// Башка методдор чакырылышы мүмкүн, мисалы addTopping() башка builderде
}
}
Колдонуу:
// Кардар коду
Kitchen kitchen = new Kitchen();
PizzaBuilder margheritaBuilder = new MargheritaPizzaBuilder();
kitchen.setPizzaBuilder(margheritaBuilder);
kitchen.constructPizza();
Pizza margherita = kitchen.getPizza();
System.out.println(margherita); // Чыгуу: Pizza with dough=Тонкая кабык, sauce=Помидор соус, cheese=Моцарелла, toppings=[]