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);
    }
}

კონტექსტში ავტომატიზაციის ტესტირებაში, "მშენებელი" ხშირად გამოიყენება ტესტის მონაცემების ან რთული ტესტის ობიექტების (მაგალითად, მომხმარებლის ობიექტი მრავალი ატრიბუტით, შეკვეთის ობიექტი რამდენიმე პოზიციით) შექმნისთვის, როდესაც საჭიროა სხვადასხვა ვარიანტების მოქნილი კონფიგურაცია სხვადასხვა ტესტის სცენარებისთვის.