Sobes.tech
Middle

რა არის დიზაინის ნიმუში 'Builder'?

sobes.tech AI

პასუხი AI-სგან

„მშენებლის“ (Builder) ნიმუში — ეს არის შექმნის ნიმუში, რომელიც განკუთვნილია რთული ობიექტების ეტაპობრივად შექმნისთვის. იგი გამოყოფს რთული ობიექტის მშენებლობის პროცესს მისი წარმოდგენიდან, ისე რომ ერთსა და იმავე მშენებლობის პროცესით შეიძლება სხვადასხვა წარმოდგენების შექმნა.

სამუშაო პრინციპები:

  1. გაყოფა: გამოყოფს ობიექტის შექმნის ლოგიკას თავად ობიექტიდან.
  2. მონაცემთა გადაცემა: მომხმარებლის კოდი (Director) გადაეცემა ობიექტის შექმნა ცალკეულ კლასს (Builder).
  3. საფეხურ-საფეხურ შექმნა: ობიექტი აგროვება კომპონენტებისგან მშენებლობის მეთოდების საშუალებით.

ძირითადი მონაწილეები:

  • პროდუქტი: რთული ობიექტი, რომელიც გვსურს შევქმნათ. იგი არ არის დაკავშირებული მშენებლობის პროცესთან.
  • Builder: აბსტრაქტული ინტერფეისი, რომელიც განსაზღვრავს ნაბიჯებს პროდუქტის მშენებლობისთვის.
  • 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;
    }
}
// დირექტორი (სურვილისამებრ)
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=[]