Ce este
Șablonul Builder construiește un obiect complex pas cu pas. În loc de un singur constructor cu o listă lungă și derutantă de argumente, constructorul pas cu pas oferă pași mici, cu nume — și un build() final care returnează obiectul finit.
Fiecare pas returnează chiar constructorul, așa că apelurile se înlănțuie într-o propoziție ușor de citit.
Exemplu: construirea unei pizza
Compară new PizzaBuilder("mare").cheese().topping("ciuperci") cu un constructor de forma new Pizza("mare", true, ["ciuperci"]) — constructorul pas cu pas spune ce înseamnă fiecare valoare, iar părțile opționale sunt pur și simplu omise.
Pași care se înlănțuie
Fiecare pas are un nume și este opțional: pizza mică îi omite pe toți și iese cu cheese: false și o listă goală de ingrediente. Fără supa de argumente true, undefined, false.
Ieșire: program TypeScript și rezultatul capturat
interface Pizza {
size: string
cheese: boolean
toppings: string[]
}
class PizzaBuilder {
private pizza: Pizza
constructor(size: string) {
this.pizza = { size: size, cheese: false, toppings: [] }
}
// Fiecare pas returnează chiar constructorul, așa că apelurile se înlănțuie.
cheese(): PizzaBuilder {
this.pizza.cheese = true
return this
}
topping(name: string): PizzaBuilder {
this.pizza.toppings.push(name)
return this
}
build(): Pizza {
return this.pizza
}
}
function describe(p: Pizza): string {
return `pizza ${p.size}, brânză: ${p.cheese}, ingrediente: [${p.toppings.join(", ")}]`
}
const big = new PizzaBuilder("mare")
.cheese()
.topping("ciuperci")
.topping("măsline")
.build()
const small = new PizzaBuilder("mică").build()
console.log(describe(big))
console.log(describe(small))
Când să îl folosești
Folosește-l când un obiect are multe părți opționale sau când construirea are pași reali care merită nume. Cererile, interogările și configurațiile sunt teritoriu clasic pentru Builder.
Renunță la el pentru obiecte simple — un literal de obiect cu proprietăți numite, { size: "mare", cheese: true, toppings: [] }, este deja un mic constructor bun pentru cazurile ușoare.
Avantaje și dezavantaje
Avantaje: construire ușor de citit; părți opționale fără liste uriașe de argumente; obiectul poate fi validat o singură dată, în build().
Dezavantaje: o a doua clasă de scris și de întreținut; este exagerat acolo unde un literal de obiect se citește deja bine.