Middle
Ի՞նչ է կառուցողը (Builder) ծրագրային ապահովման զարգացման համատեքստում։
sobes.tech AI
Պատասխան AI-ից
Դիզայնի ձևանիշը, որը բաժանում է բարդ օբյեկտի կառուցումը նրա ներկայացումից, թույլ է տալիս ստեղծել նույն կառուցման գործընթացի տարբեր ներկայացումներ:
Հիմնական առանձնահատկությունները՝
- Պատասխանատվության բաժանում: Օբյեկտի ստեղծման տրամաբանությունը (կառուցման քայլերը) և օբյեկտի ներկայացումը (վերջնական արտադրանքը) բաժանված են:
- Քայլ առ քայլ կառուցում: Օբյեկտը կառուցվում է քայլ առ քայլ, ինչը դարձնում է գործընթացը ավելի ճկուն և հասկանալի:
- Տարբեր ներկայացումներ: Միևնույն կառուցման գործընթացը կարող է օգտագործվել տարբեր տարբերակների ստեղծման համար:
- Ինկապսուլացում: Կառուցման մանրամասները թաքնված են հաճախորդից, ինչը հեշտացնում է օգտագործումը:
Հիմնական մասնակիցները՝
- Builder (Կառուցող): Աբստրակտ ինտերֆեյս կամ դաս, որը սահմանում է քայլերը արտադրանքի մասերի ստեղծման համար:
- ConcreteBuilder (Կոնկրետ Կառուցող): Կառուցողի կոնկրետ իրագործում, որը իրականացնում է մասերի կառուցումը և պահպանում արդյունքը:
- Director (Ներքին): Դաս, որը օգտագործում է ConcreteBuilder օբյեկտը արտադրանքի կառուցման համար, կանչելով համապատասխան մեթոդներ որոշակի հաջորդականությամբ:
- Product (Արտադրանք): Կազմված օբյեկտ, որը կառուցվում է:
Օգտագործման օրինակ՝
Ստեղծել Pizza օբյեկտ տարբեր բաղադրիչներով:
// Արտադրանք
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 addTopping(String topping) {
if (toppings == null) {
toppings = new ArrayList<>();
}
toppings.add(topping);
}
@Override
public String toString() {
return "Pizza with dough: " + dough + ", sauce: " + sauce + ", cheese: " + cheese + ", toppings: " + toppings;
}
}
// Builder ինտերֆեյս
interface PizzaBuilder {
void buildDough();
void buildSauce();
void buildCheese();
void addTopping(String topping);
Pizza getResult();
}
// Կոնկրետ Builder
class MargheritaPizzaBuilder implements PizzaBuilder {
private Pizza pizza;
public MargheritaPizzaBuilder() {
this.pizza = new Pizza();
}
@Override
public void buildDough() {
pizza.setDough("Բարակ կեղև");
}
@Override
public void buildSauce() {
pizza.setSauce("Տոմատի սոուս");
}
@Override
public void buildCheese() {
pizza.setCheese("Մոցարելա");
}
@Override
public void addTopping(String topping) {
// Margherita-ն չունի լրացուցիչ բաղադրիչներ ըստ նախընտրության
}
@Override
public Pizza getResult() {
return pizza;
}
}
// Ներքին
class Cook {
private PizzaBuilder pizzaBuilder;
public void setPizzaBuilder(PizzaBuilder pb) {
pizzaBuilder = pb;
}
public void constructPizza() {
pizzaBuilder.buildDough();
pizzaBuilder.buildSauce();
pizzaBuilder.buildCheese();
// Ավելացվող բաղադրիչները կարող են ավելացվել այստեղ ըստ պահանջների
}
}
// Կլիենտ կոդ
public class PizzaShop {
public static void main(String[] args) {
Cook cook = new Cook();
PizzaBuilder margheritaBuilder = new MargheritaPizzaBuilder();
cook.setPizzaBuilder(margheritaBuilder);
cook.constructPizza();
Pizza pizza = margheritaBuilder.getResult();
System.out.println(pizza);
}
}
Կիրառվում է, երբ՝
- Պետք է ստեղծել բարդ օբյեկտ բազմաթիվ պարտադիր և ոչ պարտադիր պարամետրերով:
- Օբյեկտի ստեղծման գործընթացը սեղմ և միաժամանակյա է, և ընդգրկում է բազմաթիվ քայլեր:
- Պետք է ստեղծել տարբեր տարբերակներ նույն օբյեկտի համար, օգտագործելով նույն կառուցման ալգորիթմը:
- Պետք է խուսափել մեծ քանակությամբ կոնստրուկտորներից ("թելեսկոպիկ կոնստրուկտոր").
Առավելություններ՝
- Կարդալու և պահպանման բարելավում:
- Գործնականում ստեղծման գործընթացում ճկունություն:
- Անվտանգ և փոփոխական օբյեկտների ստեղծում:
- Մեծ քանակությամբ կոնստրուկտորների անհրաժեշտության վերացում:
Մասամբ՝
- Մեծացնել դասերի քանակը նախագծում:
- Պահանջում է նախնական նախագծում։