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

Контекстте автоматташтыруу тестирлөөдө, "Куруучу" көбүнчө тест маалыматтарын же кыйын тест объекттерин түзүү үчүн колдонулат (мисалы, көп атрибуттуу колдонуучу объектиси, бир нече позициясы бар заказ объектиси), жана бул маалыматтардын ар кандай варианттарын ар кандай тест сценарийлери үчүн ийкемдүү конфигурациялоого мүмкүндүк берет.