Middle
რა არის დიზაინის ნიმუში 'Builder'?
sobes.tech AI
პასუხი AI-სგან
„მშენებლის“ (Builder) ნიმუში — ეს არის შექმნის ნიმუში, რომელიც განკუთვნილია რთული ობიექტების ეტაპობრივად შექმნისთვის. იგი გამოყოფს რთული ობიექტის მშენებლობის პროცესს მისი წარმოდგენიდან, ისე რომ ერთსა და იმავე მშენებლობის პროცესით შეიძლება სხვადასხვა წარმოდგენების შექმნა.
სამუშაო პრინციპები:
- გაყოფა: გამოყოფს ობიექტის შექმნის ლოგიკას თავად ობიექტიდან.
- მონაცემთა გადაცემა: მომხმარებლის კოდი (Director) გადაეცემა ობიექტის შექმნა ცალკეულ კლასს (Builder).
- საფეხურ-საფეხურ შექმნა: ობიექტი აგროვება კომპონენტებისგან მშენებლობის მეთოდების საშუალებით.
ძირითადი მონაწილეები:
- პროდუქტი: რთული ობიექტი, რომელიც გვსურს შევქმნათ. იგი არ არის დაკავშირებული მშენებლობის პროცესთან.
- Builder: აბსტრაქტული ინტერფეისი, რომელიც განსაზღვრავს ნაბიჯებს პროდუქტის მშენებლობისთვის.
- 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;
}
}
// დირექტორი (სურვილისამებრ)
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() სხვა ბილდერში
}
}
გამოყენება:
// მომხმარებლის კოდი
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=[]