Sobes.tech
Middle

Түзүүчү дизайн үлгүсү 'Builder' эмне?

sobes.tech AI

AIден жооп

«Курулушчу» (Builder) паттерни — бул — кыйын объекттерди кадам-кадам түзүү үчүн арналган жаратуу паттерни. Ал кыйын объекттин куруу процесси менен анын көрүнүшүн бөлүп турат, ошондуктан бир эле куруу процесси ар кандай көрүнүштөрдү түзө алат.

Иштөө принциптери:

  1. Бөлүү: Объекттин түзүү логикасын өзү объекттен бөлүп турат.
  2. Өткөрүү: Кардар коду (Director) объект түзүүнү өзүнчө класска (Builder) өткөрүп берет.
  3. Кадам-кадам түзүү: Объект түзүүчү методдордун топтому аркылуу компоненттерден жыйналат.

Негизги катышуучулар:

  • Product: Биз түзгүбүз келген кыйын объект. Ал түзүү процесси менен байланышы жок.
  • Builder: Абстракт интерфейс, ал Product түзүү үчүн кадамдарды аныктайт.
  • 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;
    }
}
// Director (опционалдуу)
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() башка builderде
    }
}

Колдонуу:

// Кардар коду
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=[]