Sobes.tech
Middle

Mis on builder (ehitaja) tarkvaraarenduse kontekstis?

sobes.tech AI

Vastus AI-lt

Disaino šablons, kas atdala sarežģīta objekta būvniecību no tā prezentācijas, ļaujot izveidot dažādus vienas un tās pašas būvniecības procesa attēlojumus.

Galvenās īpašības:

  • Atbildības sadalījums: Objekta būvniecības loģika (būvniecības soļi) un objekta prezentācija (galaprodukts) ir atdalīti.
  • Pakāpeniska būvniecība: Objekts tiek būvēts pakāpeniski, padarot procesu elastīgāku un saprotamāku.
  • Dažādi attēlojumi: Viena un tā pati būvniecības procesa var izmantot dažādu objekta variāciju izveidei.
  • Inkapusulācija: Būvniecības detaļas ir paslēptas no klienta, kas atvieglo to izmantošanu.

Galvenie dalībnieki:

  • Builder (Būvētājs): Abstrakta saskarne vai klase, kas definē soļus produkta daļu izveidei.
  • ConcreteBuilder (Konkretā būvētājs): Konkrēta būvētāja realizācija, kas veic faktisko daļu būvniecību un saglabā rezultātu.
  • Director (Direktors): Klase, kas izmanto ConcreteBuilder objektu produkta būvniecībai, izsaucot atbilstošās būvētāja metodes noteiktā secībā.
  • Product (Produkts): Sarežģīts objekts, kas tiek būvēts.

Piemērs:

Izveidot Pizza objektu ar dažādiem sastāvdaļām:

// Produkts
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 addTopping(String topping) {
        if (toppings == null) {
            toppings = new ArrayList<>();
        }
        toppings.add(topping);
    }

    @Override
    public String toString() {
        return "Pizza with dough: " + dough + ", sauce: " + sauce + ", cheese: " + cheese + ", toppings: " + toppings;
    }
}

// Būvētāja saskarne
interface PizzaBuilder {
    void buildDough();
    void buildSauce();
    void buildCheese();
    void addTopping(String topping);
    Pizza getResult();
}

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

    public MargheritaPizzaBuilder() {
        this.pizza = new Pizza();
    }

    @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 parasti neiekļauj papildu sastāvdaļas
    }

    @Override
    public Pizza getResult() {
        return pizza;
    }
}

// Direktors
class Cook {
    private PizzaBuilder pizzaBuilder;

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

    public void constructPizza() {
        pizzaBuilder.buildDough();
        pizzaBuilder.buildSauce();
        pizzaBuilder.buildCheese();
        // Papildu sastāvdaļas var pievienot šeit atkarībā no tipa vai prasībām
    }
}

// Klienta kods
public class PizzaShop {
    public static void main(String[] args) {
        Cook cook = new Cook();
        PizzaBuilder margheritaBuilder = new MargheritaPizzaBuilder();

        cook.setPizzaBuilder(margheritaBuilder);
        cook.constructPizza();

        Pizza pizza = margheritaBuilder.getResult();
        System.out.println(pizza);
    }
}

Lietošana, kad:

  • Jāizveido sarežģīts objekts ar daudzām izvēles parametriem.
  • Objekta būvniecības process ir secīgs un ietver daudz soļus.
  • Jāizveido dažādas vienas un tās pašas objekta variācijas, izmantojot vienu un to pašu būvniecības algoritmu.
  • Jāizvairās no konstruktoru ar lielu parametru skaitu ("telescoping constructor").

Priekšrocības:

  • Uzlabo koda skaitāmību un uzturēšanu.
  • Nodrošina elastību objektu izveidē.
  • Ļauj izveidot nemaināmus objektus.
  • Atbrīvo no nepieciešamības daudz konstruktoru.

Trūkumi:

  • Gali palielināt klases skaitu projektā.
  • Prasa sākotnējas projektēšanas pūles.