Sobes.tech
Middle

Kas ir dizaina paraugs 'Builder'?

sobes.tech AI

Atbilde no AI

Dizaina paraugs "Būvētājs" (Builder) ir izcelsmes paraugs, kas nodrošina veidu, kā pakāpeniski veidot sarežģītu objektu. Tas atdala sarežģīta objekta būvniecības procesu no tā attēlojuma, ļaujot izmantot to pašu būvniecības procesu dažādiem attēlojumiem.

Parauga galvenās sastāvdaļas:

  • Builder: Abstrakta vai konkrēta saskarne (vai klase), kas definē metožu kopumu, lai pakāpeniski būvētu produkta daļas.
  • ConcreteBuilder: Konkrēta Builder realizācija, kas izveido specifisku produkta attēlojumu. Viņš zina visas būvniecības detaļas.
  • Director: Izvēles, bet bieži lietojama klase. Nosaka būvniecības soļu secību, lai izveidotu noteiktu produkta konfigurāciju.
  • Product: Sarežģīts objekts, kas tiek būvēts. Tas sastāv no daudziem elementiem.

Priekšrocības:

  • Ļauj pakāpeniski veidot sarežģītus objektus, izvairoties no "teleskopiskiem" konstruktoriem (ar daudz parametru).
  • Iekapsulē sarežģīta objekta būvniecības loģiku.
  • Atvieglo produkta iekšējā attēlojuma maiņu.
  • Ļauj izmantot to pašu būvniecības procesu dažādu produkta variāciju izveidei.

Piemēri:

// Produkts
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;
    }
}

// Dizaina saskarne
interface PizzaBuilder {
    void buildDough();
    void buildSauce();
    void buildToppings();
    Pizza getPizza();
}

// Konkrētais būvētājs
class MargheritaPizzaBuilder implements PizzaBuilder {
    private Pizza pizza = new Pizza();

    @Override
    public void buildDough() {
        pizza.setDough("plāna mīkla");
    }

    @Override
    public void buildSauce() {
        pizza.setSauce("tomātu");
    }

    @Override
    public void buildToppings() {
        pizza.addTopping("mozzarella");
        pizza.addTopping("baziliks");
    }

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

// Direktors (izvēles)
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();
    }
}

// Piemērs
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);
    }
}

Kontekstā automatizētajā testēšanā, "Būvētājs" bieži tiek izmantots, lai izveidotu testu datus vai sarežģītus testu objektus (piemēram, lietotāja objektu ar daudziem atribūtiem, pasūtījuma objektu ar vairākām pozīcijām), kad ir nepieciešams elastīgi konfigurēt dažādas šo datu variācijas dažādiem testu scenārijiem.