Middle
რა არის ბილდერი (Builder) პროგრამული უზრუნველყოფის განვითარების კონტექსტში?
sobes.tech AI
პასუხი AI-სგან
Дизайн үлгү, ал кыйынчылык менен түзүлгөн объекттин түзүлүшүн анын көрсөтүүсүнөн бөлүп турат, бир эле куруу процесси үчүн ар кандай көрсөтүүлөрдү түзүүгө мүмкүндүк берет.
Негизги өзгөчөлүктөр:
- Жоопкерчиликти бөлүү: Объект түзүү логикасы (куруу кадамдары) жана объекттин көрсөтүлүшү (жыйынтык продукт) бөлүнөт.
- Кадам-кадам куруу: Объект кадам-кадам менен курулат, бул процессти ийкемдүү жана түшүнүктүү кылат.
- Ар кандай көрсөтүүлөр: Бир эле куруу процесси ар кандай вариацияларды түзүү үчүн колдонулушу мүмкүн.
- Инкапсуляция: Объект түзүү деталдары кардардан жашырылган, бул анын колдонулушун жеңилдетет.
Негизги катышуучулар:
- Builder (Куруучу): Абстракттуу интерфейс же класс, продукт бөлүктөрүн түзүү кадамдарын аныктайт.
- ConcreteBuilder (Конкреттүү куруучу): Куруучунун конкреттүү ишке ашырылышы, ал чынжырды түзөт жана натыйжаны сактайт.
- Director (Директор): Класс, ал ConcreteBuilder объектисин колдонуп продукт түзөт, жана тиешелүү куруучу методдорун белгиленген тартипте чакырат.
- Product (Продукт): Курулган татаал объект.
Колдонуу мисалы:
Pizza объектисин ар кандай ингредиенттер менен түзүү:
// Product
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 with dough: " + dough + ", sauce: " + sauce + ", cheese: " + cheese + ", toppings: " + toppings;
}
}
// Builder интерфейси
interface PizzaBuilder {
void buildDough();
void buildSauce();
void buildCheese();
void addTopping(String topping);
Pizza getResult();
}
// Конкреттүү куруучу
class MargheritaPizzaBuilder implements PizzaBuilder {
private Pizza pizza;
public MargheritaPizzaBuilder() {
this.pizza = new Pizza();
}
@Override
public void buildDough() {
pizza.setDough("Тонкая кытырлаак");
}
@Override
public void buildSauce() {
pizza.setSauce("Томат соусу");
}
@Override
public void buildCheese() {
pizza.setCheese("Моцарелла");
}
@Override
public void addTopping(String topping) {
// Margherita кошумча толтурмдарга ээ эмес
}
@Override
public Pizza getResult() {
return pizza;
}
}
// Директор
class Cook {
private PizzaBuilder pizzaBuilder;
public void setPizzaBuilder(PizzaBuilder pb) {
pizzaBuilder = pb;
}
public void constructPizza() {
pizzaBuilder.buildDough();
pizzaBuilder.buildSauce();
pizzaBuilder.buildCheese();
// Кошумча толтурмдар бул жерге кошулушу мүмкүн
}
}
// Клиент коду
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);
}
}
Колдонуу шарттары:
- Көптөгөн милдеттүү эмес параметрлери бар татаал объект түзүү керек болсо.
- Объект түзүү процесси үзгүлтүксүз жана көп кадамдарды камтыйт.
- Бир эле алгоритм менен бир нече вариация түзүү керек болсо.
- "Телескоптук" конструкторлордун санын азайтуу керек болсо.
Артыкчылыктары:
- Коддун окуулушу жана колдоосун жакшыртат.
- Объекттерди түзүүдө ийкемдүүлүк берет.
- Өзгөрүлбөс объекттерди түзүүгө мүмкүндүк берет.
- Конструкторлордун көптүгүнөн кутулат.
Кемчиликтери:
- Проектте класстардын санын көбөйтүшү мүмкүн.
- Баштапкы долбоорлоону талап кылат.