všetky vzory

Builder

Skladá zložitý objekt po krokoch, aby rovnaký postup dal rôzne výsledky.

class Builder {  base() { throw new Error('abstraktná metóda'); }  filling() { throw new Error('abstraktná metóda'); }  dressing() { throw new Error('abstraktná metóda'); }  result() { throw new Error('abstraktná metóda'); }} class BurgerBuilder extends Builder {  parts = [];  base() { this.parts.push(new Bun()); }  filling() { this.parts.push(new Patty()); }  dressing() { this.parts.push(new Dressing()); }  // The burger is born only here. Until then there are only parts.  result() { return new Burger(this.parts); }} class RecipeBuilder extends Builder {  lines = [];  base() { this.lines.push('1. Slice the bun.'); }  filling() { this.lines.push('2. Grill the patty.'); }  dressing() { this.lines.push('3. Add the dressing.'); }  result() { return new Recipe(this.lines); }} // The kitchen knows the steps and nothing else. It never holds the result.class Kitchen {  prepare(builder) {    builder.base();    builder.filling();    builder.dressing();  }} const kitchen = new Kitchen(); const s1 = new BurgerBuilder();kitchen.prepare(s1);s1.result();   // Burger const s2 = new RecipeBuilder();kitchen.prepare(s2);s2.result();   // Recipe — the same steps, a different result

Celý priebeh v texte (18 krokov)
  1. Builder je abstraktný. Hovorí len to, že postup má tri kroky a na konci vydá výsledok — nič o tom, čo z neho vyjde. Obe staviteľky ho dedia.
  2. Zákazník si povie kuchyni, že chce burger. O postupe nevie nič a ani ho nepotrebuje — postup je v kuchyni.
  3. Kuchyňa vedie postup. Prvý krok: základ. Staviteľka si žemľu odloží k sebe a nevracia nič — zákazník nedostal ani polovicu burgera.
  4. Druhý krok: náplň. Druhý diel pribudne k prvému. Kuchyňa len volá kroky v poradí, ktoré pozná.
  5. Tretí krok: dresing. Tri volania, tri diely — a von sa doteraz nevrátilo nič.
  6. Rozpracovaný stav drží staviteľka — nie zákazník a nie kuchyňa. Burger v tejto chvíli neexistuje, existujú len jeho diely.
  7. Až teraz si zákazník vyžiada výsledok. Volá staviteľku priamo: kuchyňa hotový burger nikdy nedrží, tá pozná iba postup.
  8. A tu je celý vzor: z troch dielov vznikne jeden hotový burger. Nie tri objekty vedľa seba a nie diel obalený dielom — jeden nový objekt, ktorý dovtedy neexistoval.
  9. Hotový burger putuje zákazníkovi. Dostal presne jeden objekt, aj keď postup mal tri kroky.
  10. Druhé kolo. Zákazník chce k tomu aj receptúru, takže kuchyňa dostane inú staviteľku. Nič iné sa nemení.
  11. Prvý krok: základ. Presne to isté volanie ako pred chvíľou — RecipeBuilder si z neho ale odloží vetu o žemli, nie žemľu.
  12. Druhý krok: náplň. Druhá kapitola receptúry.
  13. Tretí krok: dresing. Tretia kapitola. Poradie krokov je to isté, obsah dielov úplne iný.
  14. Kuchyňa je v oboch kolách nezmenená. Nepozná ani žemľu, ani kapitolu — vie len, že staviteľka má tri kroky a potom vydá výsledok.
  15. Zákazník si vyžiada aj tento výsledok.
  16. Z troch kapitol jeden recept. Iný tvar, iná farba — a hlavne iný typ objektu než burger, hoci ho vyskladal ten istý postup.
  17. Aj recept putuje zákazníkovi.
  18. Dva úplne rôzne výrobky z jedného a toho istého postupu. Postup sa nikam nezdvojil, len dostal druhú staviteľku — a keby zákazník chcel tretí výsledok, napríklad nutričnú etiketu, kuchyňa sa nemení ani vtedy.

Kedy použiť

  • Konštruktor by mal priveľa nepovinných parametrov — new Burger(true, false, null, 2) sa nedá prečítať.
  • Ten istý postup má vydať rôzne výsledky — burger, receptúra, nutričná etiketa.
  • Rozpracovaný objekt nemá nikto vidieť — kým staviteľ neskončí, diely si drží u seba.
  • Poradie krokov patrí na jedno miesto — direktor ho pozná raz za všetkých.
  • Hotový objekt má byť nemenný — vznikne naraz z dielov, takže nepotrebuje settery.

Pasce

  • Direktor sa často pridá zbytočne — pri jedinom nemennom postupe je to trieda s jednou metódou.
  • Zamieňa sa s Abstract Factory — tá vydá objekt jedným volaním, staviteľ ho skladá po krokoch.
  • Zamieňa sa s Decoratorom — ten obaľuje hotový objekt vrstvami, staviteľ z dielov robí nový.
  • Staviteľ, ktorý sa po vydaní výsledku nevyprázdni, pridá do druhého burgera diely prvého.
  • Nikto nezabráni vyžiadať výsledok bez náplne — chyba sa nájde až u zákazníka.
  • Pri troch krokoch je vzor drahší než pomenované parametre — štyri triedy namiesto konštruktora.