Sobes.tech
Middle

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

sobes.tech AI

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

Դիզայնի նմուշ՝ "Կառուցող" (Builder) — դա ծնողական նմուշ է, որը տրամադրում է միջոց՝ բարդ օբյեկտը քայլ առ քայլ ստեղծելու համար։ Այն բաժանում է բարդ օբյեկտի կառուցման գործընթացը նրա ներկայացումից, ինչը թույլ է տալիս օգտագործել նույն կառուցման գործընթացը տարբեր ներկայացումների համար:

Նմուշի հիմնական բաղադրիչները:

  • Builder: Աբստրակտ կամ կոնկրետ ինտերֆեյս (կամ դաս), որը սահմանում է մեթոդների հավաքածու՝ արտադրանքի մասերի քայլ առ քայլ կառուցելու համար։
  • ConcreteBuilder: Կոնկրետ Builder-ի իրագործում, որը ստեղծում է արտադրանքի հատուկ ներկայացում։ Գիտե բոլոր մանրամասները կառուցման մասին։
  • Director: Ընտրովի, բայց հաճախ օգտագործվող դաս։ Այն սահմանում է կառուցման քայլերի կանոնավորությունը՝ որոշակի արտադրանքի կոնֆիգուրացիա ստեղծելու համար։
  • Product: Բարդ օբյեկտ, որը կառուցվում է։ Այն բաղկացած է բազմաթիվ մասերից։

Առավելությունները՝

  • Մեկ քայլով ստեղծել բարդ օբյեկտներ՝ խուսափելով "տելեսկոպիկ" կոնստրուկցորներից (մեծ թվով պարամետրերով կոնստրուկցորներ)։
  • Ինքագրում է բարդ օբյեկտի ստեղծման տրամաբանությունը։
  • Հեշտացնում է արտադրանքի ներքին ներկայացման փոփոխությունը։
  • Օգտագործում է նույն կառուցման գործընթացը՝ տարբեր արտադրանքների տարբերակներ ստեղծելու համար։

Համապատասխանություն՝

  • Երբ արտադրանքի ստեղծման գործընթացը ներառում է շատ քայլեր, և այդ քայլերը պետք է կատարվեն որոշակի կարգով։
  • Երբ անհրաժեշտ է ունենալ նույն օբյեկտի տարբեր ներկայացումներ։
  • Երբ օբյեկտի կոնստրուկցորը շատ շատ ընտրովի պարամետրեր ունի։

Օրինակ՝

// Արտադրանք
class Pizza {
    private String dough = "";
    private String sauce = "";
    private List<String> toppings = new ArrayList<>();

    public void setDough(String dough) {
        this.dough = dough;
    }

    public void setSauce(String sauce) {
        this.sauce = sauce;
    }

    public void addTopping(String topping) {
        this.toppings.add(topping);
    }

    @Override
    public String toString() {
        return "Pizza with dough: " + dough + ", sauce: " + sauce + ", toppings: " + toppings;
    }
}

// Դիզայնի ինտերֆեյս
interface PizzaBuilder {
    void buildDough();
    void buildSauce();
    void buildToppings();
    Pizza getPizza();
}

// Կոնկրետ Դիզայն
class MargheritaPizzaBuilder implements PizzaBuilder {
    private Pizza pizza = new Pizza();

    @Override
    public void buildDough() {
        pizza.setDough("thin crust");
    }

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

    @Override
    public void buildToppings() {
        pizza.addTopping("mozzarella");
        pizza.addTopping("basil");
    }

    @Override
    public Pizza getPizza() {
        return this.pizza;
    }
}

// Օպերատոր (ընտրովի)
class Cook {
    private PizzaBuilder pizzaBuilder;

    public void setPizzaBuilder(PizzaBuilder pb) {
        pizzaBuilder = pb;
    }

    public Pizza getPizza() {
        return pizzaBuilder.getPizza();
    }

    public void constructPizza() {
        pizzaBuilder.buildDough();
        pizzaBuilder.buildSauce();
        pizzaBuilder.buildToppings();
    }
}

// Օգտագործում
public class BuilderExample {
    public static void main(String[] args) {
        Cook cook = new Cook();
        PizzaBuilder margheritaBuilder = new MargheritaPizzaBuilder();

        cook.setPizzaBuilder(margheritaBuilder);
        cook.constructPizza();

        Pizza margherita = cook.getPizza();
        System.out.println(margherita);
    }
}

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