Sobes.tech
Middle

Паттерни тарҳрезии 'Builder' чӣ аст?

sobes.tech AI

Ҷавоб аз AI

Шаблонии тарҳрезии "Builder" (Сохтанда) як намунаи эҷодкунанда аст, ки роҳи сохтани объектҳои мураккабро қадам ба қадам пешниҳод мекунад. Он равандрои сохтани объектҳои мураккабро аз намоиши онҳо ҷудо мекунад, ки имкон медиҳад, ки як раванд барои сохтани намоишҳои гуногун истифода шавад.

Компонентҳои асосии намуна:

  • Builder: Интерфейс ё синфи абстрактӣ (ё конкретӣ), ки маҷмӯи усулҳоро барои сохтани қадам ба қадам қисмҳои маҳсулот муайян мекунад.
  • ConcreteBuilder: Иҷрои конкретии Builder, ки намоиши махсуси маҳсулотро месозад. Ҳамаи тафсилоти сохтани онро медонад.
  • Director: Синфи интихобӣ, аммо аксар вақт истифода мешавад. Рақамро муайян мекунад, ки қадамҳои сохтани маҳсулотро дар кадом тартиб даъват кунад.
  • Product: Объекти мураккаб, ки сохта мешавад. Аз қисмҳои зиёде иборат аст.

Афзалиятҳо:

  • Имкон медиҳад, ки объектҳои мураккабро қадам ба қадам созанд, аз конструкторҳои "телескоп" (бо шумораи зиёди параметрҳо) канорагирӣ кунанд.
  • Логикаи сохтани объектро дар бар мегирад.
  • Идоракунии тағирот дар намоиши дохилии маҳсулотро осон мекунад.
  • Имкон медиҳад, ки як раванд барои сохтани вариантҳои гуногуни маҳсулот истифода шавад.

Барномаҳо:

  • Вақте ки равандҳои сохтани объект бисёр қадамро дар бар мегирад ва ин қадамҳо бояд дар тартиби муайян иҷро шаванд.
  • Вақте ки намоишҳои гуногуни як объект лозим аст.
  • Вақте ки конструктори объект дорои шумораи зиёди параметрҳои интихобӣ мебошад.

Масалан:

// Маҳсулот
class Pizza {
    private String хамир = "";
    private String соус = "";
    private List<String> иловаҳо = new ArrayList<>();

    public void setХамир(String хамир) {
        this.хамир = хамир;
    }

    public void setСоус(String соус) {
        this.соус = соус;
    }

    public void addИлова(String иловагӣ) {
        this.иловаҳо.add(илова); 
    }

    @Override
    public String toString() {
        return "Пицца бо хамир: " + хамир + ", соус: " + соус + ", иловаҳо: " + иловаҳо;
    }
}

// Интерфейси сохтани
interface PizzaBuilder {
    void buildХамир();
    void buildСоус();
    void buildИлова();
    Pizza getPizza();
}

// Конкретӣ
class MargheritaPizzaBuilder implements PizzaBuilder {
    private Pizza pizza = new Pizza();

    @Override
    public void buildХамир() {
        pizza.setХамир("тонке");
    }

    @Override
    public void buildСоус() {
        pizza.setСоус("томат");
    }

    @Override
    public void buildИлова() {
        pizza.addИлова("моцарелла");
        pizza.addИлова("базилик");
    }

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

// Директор (интихобӣ)
class Гӯштингар {
    private PizzaBuilder pizzaBuilder;

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

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

    public void сохтаниПицца() {
        pizzaBuilder.buildХамир();
        pizzaBuilder.buildСоус();
        pizzaBuilder.buildИлова();
    }
}

// Истифода
public class BuilderExample {
    public static void main(String[] args) {
        Гӯштингар гӯштингар = new Гӯштингар();
        PizzaBuilder margheritaBuilder = new MargheritaPizzaBuilder();

        гӯштингар.setPizzaBuilder(margheritaBuilder);
        гӯштингар.сохтаниПицца();

        Pizza margherita = гӯштингар.getPizza();
        System.out.println(margherita);
    }
}

Дар контексти автоматизатсияи тест, "Builder" одатан барои сохтани маълумоти тестӣ ё объектҳои мураккаб (масалан, объекти корбар бо бисёр хусусиятҳо, объекти фармоиш бо чандин ҷойгиршавӣ) истифода мешавад, вақте ки лозим аст, ки вариантҳои гуногуни ин маълумотҳоро барои сценарийҳои гуногуни тестӣ боэътимод танзим кардан мумкин аст.