Sobes.tech
Middle

Mis on disainimuster 'Builder'?

sobes.tech AI

Vastus AI-lt

„Ehitusmeistri“ (Builder) muster on loomise muster, mis on mõeldud keeruliste objektide samm-sammult loomise jaoks. See eraldab keerulise objekti ehitusprotsessi selle esitlusest nii, et sama ehitusprotsess võib luua erinevaid esitlusi.

Töö põhimõtted:

  1. Jagamine: Eraldab objekti loomise loogika ise objektist.
  2. Edastamine: Klientkood (Director) edastab objekti loomise eraldi klassile (Builder).
  3. Samm-sammult loomine: Objekt kogutakse koostisosadest, kasutades ehitaja meetodite kogumit.

Peamised osalejad:

  • Toode: Keeruline objekt, mida soovime luua. Ei sõltu loomise protsessist.
  • Builder: Abstraktne liides, mis määratleb sammud toote ehitamiseks.
  • ConcreteBuilder: Konkreetne teostus, mis realiseerib sammud ja pakub meetodit valmis toote saamiseks.
  • Director (valikuline): Määrab ehitussammude järjekorra. Ei ole kohustuslik, klientkood võib otse suhelda ConcreteBuilderiga.

Eelised:

  • võimaldab luua objekte, millel on palju kohustuslikke parameetreid, selgemalt kui paljude argumentidega konstruktorid või setterite ahelad.
  • võimaldab luua erinevaid variatsioone ühe ja sama objekti kasutades sama ehitusprotsessi.
  • varjab loodava objekti sisemist struktuuri.

Puudused:

  • võib suurendada klasside arvu projektis (Builder, ConcreteBuilder, Product, Director).

Näide: objekti Pizza loomine erinevate koostisosadega:

// Toode
public class Pizza {
    private String dough;
    private String sauce;
    private String cheese;
    private List<String> toppings;

    public void setDough(String dough) { this.dough = dough; }
    public void setSauce(String sauce) { this.sauce = sauce; }
    public void setCheese(String cheese) { this.cheese = cheese; }
    public void setToppings(List<String> toppings) { this.toppings = toppings; }

    @Override
    public String toString() {
        return "Pizza with dough=" + dough + ", sauce=" + sauce + ", cheese=" + cheese + ", toppings=" + toppings;
    }
}
// Ehitusmeistri liides
public interface PizzaBuilder {
    void buildDough();
    void buildSauce();
    void buildCheese();
    void addTopping(String topping);
    Pizza getPizza();
}
// Konkreetne ehitaja
public class MargheritaPizzaBuilder implements PizzaBuilder {
    private Pizza pizza;

    public MargheritaPizzaBuilder() {
        this.pizza = new Pizza();
        this.pizza.setToppings(new ArrayList<>()); // Toppingute nimekirja initsialiseerimine
    }

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

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

    @Override
    public void buildCheese() {
        pizza.setCheese("Mozzarella");
    }

    @Override
    public void addTopping(String topping) {
        // Margherita ei lisa täiendavaid toppinge, välja arvatud põhivõimalused
    }

    @Override
    public Pizza getPizza() {
        return this.pizza;
    }
}
// Juht (valikuline)
public class Kitchen {
    private PizzaBuilder pizzaBuilder;

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

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

    public void constructPizza() {
        pizzaBuilder.buildDough();
        pizzaBuilder.buildSauce();
        pizzaBuilder.buildCheese();
        // Võivad olla kutsutud ka teised meetodid, näiteks addTopping() teises ehitajas
    }
}

Kasutus:

// Klientkood
Kitchen kitchen = new Kitchen();
PizzaBuilder margheritaBuilder = new MargheritaPizzaBuilder();

kitchen.setPizzaBuilder(margheritaBuilder);
kitchen.constructPizza();

Pizza margherita = kitchen.getPizza();
System.out.println(margherita); // Väljund: Pizza with dough=Õhuke koor, sauce=Tomatimahl, cheese=Mozzarella, toppings=[]