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