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);
    }
}

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

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

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

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

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

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