Sobes.tech
Middle

Ի՞նչ է նախագծման նմուշը 'Builder'։

sobes.tech AI

Պատասխան AI-ից

«Կառուցողի» (Builder) դիզայնի օրինակն է՝ ստեղծող դիզայնի օրինակ, որը նախատեսված է բարդ օբյեկտների կառուցումը քայլ առ քայլ։ Այն բաժանում է բարդ օբյեկտի կառուցման գործընթացը նրա ներկայացումից՝ այնպես, որ նույն կառուցման գործընթացը կարող է ստեղծել տարբեր ներկայացումներ։

Աշխատանքի սկզբունքները:

  1. Բաժանում: Բաժանում է օբյեկտի ստեղծման տրամաբանությունը ինքն օբյեկտից:
  2. Ներկայացման փոխանցում: Հաճախորդի կոդը (Director) փոխանցում է օբյեկտի ստեղծումը առանձին դասին (Builder):
  3. Քայլ առ քայլ ստեղծում: Օբյեկտը հավաքվում է բաղադրիչ մասերից՝ օգտագործելով կառուցողի մեթոդների հավաքածու:

Հիմնական մասնակիցները:

  • Ապրանք: Բարդ օբյեկտ, որը մենք ուզում ենք կառուցել։ Չի կախված կառուցման գործընթացից:
  • Builder: Աբստրակտ ինտերֆեյս, որը սահմանում է քայլերը՝ արտադրանքի կառուցման համար:
  • ConcreteBuilder: կոնկրետ իրականացման builder, որը իրականացնում է կառուցման քայլերը և տրամադրում պատրաստի ապրանքի ստացման մեթոդ:
  • 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("Thin crust");
    }

    @Override
    public void buildSauce() {
        pizza.setSauce("Tomato sauce");
    }

    @Override
    public void buildCheese() {
        pizza.setCheese("Mozzarella");
    }

    @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=Thin crust, sauce=Tomato sauce, cheese=Mozzarella, toppings=[]