Sobes.tech
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);
    }
}

Колдонуу шарттары:

  • Көптөгөн милдеттүү эмес параметрлери бар татаал объект түзүү керек болсо.
  • Объект түзүү процесси үзгүлтүксүз жана көп кадамдарды камтыйт.
  • Бир эле алгоритм менен бир нече вариация түзүү керек болсо.
  • "Телескоптук" конструкторлордун санын азайтуу керек болсо.

Артыкчылыктары:

  • Коддун окуулушу жана колдоосун жакшыртат.
  • Объекттерди түзүүдө ийкемдүүлүк берет.
  • Өзгөрүлбөс объекттерди түзүүгө мүмкүндүк берет.
  • Конструкторлордун көптүгүнөн кутулат.

Кемчиликтери:

  • Проектте класстардын санын көбөйтүшү мүмкүн.
  • Баштапкы долбоорлоону талап кылат.