všetky vzory

Builder

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

class Stavitel {  zaklad() { throw new Error('abstraktná metóda'); }  naplna() { throw new Error('abstraktná metóda'); }  dresing() { throw new Error('abstraktná metóda'); }  vysledok() { throw new Error('abstraktná metóda'); }} class BurgerStavitel extends Stavitel {  diely = [];  zaklad() { this.diely.push(new Zemla()); }  naplna() { this.diely.push(new Karbonatka()); }  dresing() { this.diely.push(new Dresing()); }  // Burger vznikne až tu. Dovtedy existujú len diely.  vysledok() { return new Burger(this.diely); }} class ReceptStavitel extends Stavitel {  riadky = [];  zaklad() { this.riadky.push('1. Prekroj žemľu.'); }  naplna() { this.riadky.push('2. Opeč karbonátku.'); }  dresing() { this.riadky.push('3. Pridaj dresing.'); }  vysledok() { return new Recept(this.riadky); }} // Kuchyňa pozná postup a nič iné. Výsledok nikdy nedrží.class Kuchyna {  priprav(stavitel) {    stavitel.zaklad();    stavitel.naplna();    stavitel.dresing();  }} const kuchyna = new Kuchyna(); const s1 = new BurgerStavitel();kuchyna.priprav(s1);s1.vysledok();   // Burger const s2 = new ReceptStavitel();kuchyna.priprav(s2);s2.vysledok();   // Recept — ten istý postup, iný výsledok

Celý priebeh v texte (18 krokov)
  1. Stavitel 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 — ReceptStavitel 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 parametrov a väčšina z nich je nepovinná. Volanie new Burger(true, false, null, 2, „bez cibule") sa nedá prečítať a s každým ďalším variantom pribudne ďalší parameter.
  • Ten istý postup má vydať rôzne výsledky. Kroky sú jedny, staviteliek viac — burger, receptúra, nutričná etiketa.
  • Rozpracovaný objekt nemá nikto vidieť. Polovičný burger neexistuje ako hodnota: kým staviteľ neskončí, diely si drží u seba.
  • Poradie krokov patrí na jedno miesto. Direktor ho pozná raz a všetci, ktorí ho použijú, ho majú rovnako.
  • Hotový objekt má byť nemenný. Staviteľ zbiera diely mimo neho a objekt vznikne naraz z nich, takže nepotrebuje settery.

Pasce

  • Direktor sa často pridá zbytočne. Keď je postup jediný a nikto ho nemení, je to trieda s jednou metódou — a vzor bez druhej staviteľky nemá čo ukázať.
  • Zamieňa sa s Abstract Factory. Fabrika vydá objekt jedným volaním, staviteľ ho skladá po krokoch a výsledok vydá až na konci. Keď nemáš čo skladať, staviteľa nepotrebuješ.
  • Zamieňa sa s Decoratorom. Dekorátor obaľuje hotový objekt vrstvami a každá vrstva je navonok ten istý typ. Staviteľ nič neobaľuje — zbiera diely a na konci z nich urobí jeden nový objekt.
  • Staviteľ použitý druhýkrát si pamätá prvé kolo. Ak sa po vydaní výsledku nevyprázdni, druhý burger dostane aj diely toho prvého.
  • Vzor sám nekontroluje, či je postup úplný. Nikto ti nezabráni vyžiadať výsledok bez náplne — dostaneš žemľu s dresingom a chybu nájdeš až u zákazníka.
  • Kroky sa dajú zavolať v inom poradí, než postup predpokladá. Direktor to drží pod kontrolou, priamy prístup ku staviteľke už nie.
  • Pri jednom povinnom kroku a dvoch nepovinných je vzor drahší než pomenované parametre. Štyri triedy namiesto jedného konštruktora sa musia niečím zaplatiť.