Sobes.tech
Middle

Kas ir dizaina paraugs 'Builder'?

sobes.tech AI

Atbilde no AI

„Celtniecēja“ (Builder) šablons ir izstrādes šablons, kas paredzēts sarežģītu objektu pakāpeniskai izveidei. Tas atdala sarežģīta objekta būvniecības procesu no tā attēlojuma, tādējādi, ka tas pats būvniecības process var radīt dažādus attēlojumus.

Darba principi:

  1. Sadalīšana: Atdala objekta izveides loģiku no paša objekta.
  2. Pārsūtīšana: Klienta kods (Director) pārsūta objekta izveidi atsevišķai klasei (Builder).
  3. Pakāpeniska izveide: Objekts tiek savākts no sastāvdaļām, izmantojot būvētāja metožu kopumu.

Galvenie dalībnieki:

  • Produkts: Sarežģīts objekts, kuru vēlamies izveidot. Tas nav atkarīgs no būvniecības procesa.
  • Builder: Abstrakts interfeiss, kas definē soļus produkta būvniecībai.
  • ConcreteBuilder: Konkrēta realizācija, kas īsteno soļus un nodrošina metodi gatava produkta saņemšanai.
  • Director (neobligāti): Nosaka būvniecības soļu secību. Nav obligāti, klients var tieši sadarboties ar ConcreteBuilder.

Priekšrocības:

  • Ļauj izveidot objektus ar daudzām obligātām parametru kombinācijām skaidrāk nekā ar daudzargumentu konstruktoru vai sērijveida sērijām.
  • Ļauj izveidot dažādas vienas un tās pašas objekta variācijas, izmantojot vienu un to pašu būvniecības procesu.
  • Slēpj izveidotā objekta iekšējo struktūru.

Trūkumi:

  • Var palielināt klases skaitu projektā (Builder, ConcreteBuilder, Product, Director).

Piemērs: objekta Pizza izveide ar dažādiem ingredientiem:

// Produkts
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;
    }
}
// Būvētājs
public interface PizzaBuilder {
    void buildDough();
    void buildSauce();
    void buildCheese();
    void addTopping(String topping);
    Pizza getPizza();
}
// Konkrētais būvētājs
public class MargheritaPizzaBuilder implements PizzaBuilder {
    private Pizza pizza;

    public MargheritaPizzaBuilder() {
        this.pizza = new Pizza();
        this.pizza.setToppings(new ArrayList<>()); // Toppingu saraksta inicializācija
    }

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

    @Override
    public void buildSauce() {
        pizza.setSauce("Tomātu mērce");
    }

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

    @Override
    public void addTopping(String topping) {
        // Margherita ne pievieno papildu toppingus, izņemot pamata
    }

    @Override
    public Pizza getPizza() {
        return this.pizza;
    }
}
// Direktors (neobligāti)
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();
        // Var tikt izsaukti arī citi metodes, piemēram, addTopping() citā būvētājā
    }
}

Piemērs lietošanai:

// Klienta kods
Kitchen kitchen = new Kitchen();
PizzaBuilder margheritaBuilder = new MargheritaPizzaBuilder();

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

Pizza margherita = kitchen.getPizza();
System.out.println(margherita); // Izvade: Pizza with dough=Plāna mīkla, sauce=Tomātu mērce, cheese=Mozzarella, toppings=[]