Sobes.tech
Middle

Mis on disainimuster 'Builder'?

sobes.tech AI

Vastus AI-lt

Disaini muster "Ehitusmees" (Builder) on päritolu muster, mis pakub viisi, kuidas luua keeruline objekt samm-sammult. See eraldab keeruka objekti ehitusprotsessi selle esitlusest, võimaldades kasutada sama ehitusprotsessi erinevate esituste loomiseks.

Mustri põhikomponendid:

  • Builder: Abstraktne või konkreetne liides (või klass), mis määratleb meetodite kogumi, et samm-sammult ehitada toote osi.
  • ConcreteBuilder: Konkreetne Builderi teostus, mis loob spetsiifilise toote esituse. Ta teab kõiki ehituse detaile.
  • Director: Valikuline, kuid sageli kasutatav klass. Määrab ehitussammude järjekorra, et luua teatud toote konfiguratsioon.
  • Product: Keeruline objekt, mida ehitatakse. Koosneb paljudest osadest.

Eelised:

  • Võimaldab samm-sammult luua keerulisi objekte, vältides "teleskoopseid" konstruktorid (konstruktorid, millel on palju parameetreid).
  • Inkapsuleerib keeruka objekti loomise loogika.
  • Lihtsustab toote sisemise esituse muutmist.
  • Võimaldab kasutada sama ehitusprotsessi erinevate tootevariantide loomiseks.

Rakendused:

  • Kui objekti loomise protsess hõlmab palju samme ja need sammud peavad toimuma kindlas järjekorras.
  • Kui on vaja erinevaid sama objekti esitusi.
  • Kui objekti konstruktoril on väga palju valikulisi parameetreid.

Näide:

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

// Disaini liides
interface PizzaBuilder {
    void buildDough();
    void buildSauce();
    void buildToppings();
    Pizza getPizza();
}

// Konkreetne ehitaja
class MargheritaPizzaBuilder implements PizzaBuilder {
    private Pizza pizza = new Pizza();

    @Override
    public void buildDough() {
        pizza.setDough("õhuke koor");
    }

    @Override
    public void buildSauce() {
        pizza.setSauce("tomat");
    }

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

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

// Direktori (valikuline)
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();
    }
}

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

Automatiseerimise testimise kontekstis kasutatakse "Ehitusmeest" sageli testandmete või keerukate testobjektide (näiteks kasutajaobjekti paljude atribuutidega, tellimuseobjekti mitme positsiooniga) loomisel, kui on vaja paindlikult konfigureerida nende andmete erinevaid variatsioone erinevate teststsenaariumide jaoks.