Sobes.tech
Middle

Құрылысшы (Builder) жобалау үлгісі дегеніміз не?

sobes.tech AI

AI-дан жауап

"Құрылысшы" (Builder) үлгісі — бұл күрделі объектілерді кезең-кезеңімен құруға арналған туады жобалау үлгісі. Ол күрделі объектінің құрылыс процесін оның көрінісінен бөледі, сонда бірдей құрылыс процесі әртүрлі көріністерді құра алады.

Жұмыс принциптері:

  1. Бөлу: Объектіні құру логикасын объектіден бөледі.
  2. Өкілдік ету: Клиенттік код (Director) объектіні құруды бөлек классқа (Builder) жүктейді.
  3. Қадамдық құру: Объект құрастырушының әдістер жиынтығы арқылы құралады.

Негізгі қатысушылар:

  • Өнім: Біз құрастыратын күрделі объект. Ол құру процесінен тәуелсіз.
  • Builder: Абстрактілі интерфейс, Product құру қадамдарын анықтайды.
  • ConcreteBuilder: Builder-дің нақты жүзеге асуы, құру қадамдарын жүзеге асырады және дайын Product-ты алуға әдіс береді.
  • 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;
    }
}
// Құрылысшы
public interface PizzaBuilder {
    void buildDough();
    void buildSauce();
    void buildCheese();
    void addTopping(String topping);
    Pizza getPizza();
}
// Нақты құрылысшы
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;
    }
}
// Басқарушы (міндетті емес)
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() басқа құрылысшыда
    }
}

Қолдану:

// Клиенттік код
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=[]