všetky vzory

Prototype

Vytvára nové objekty klonovaním existujúceho namiesto volania konštruktora.

class Prototyp {  klonuj() { throw new Error('abstraktná metóda'); }} class FormularSablona extends Prototyp {  constructor() {    super();    this.polia = [];    this.styl = null;  }   klonuj() {    const kopia = new FormularSablona();    kopia.polia = [...this.polia];    kopia.styl = this.styl;    return kopia;  }} // Nastavenie je drahé a robí sa raz.const sablona = new FormularSablona();sablona.polia = nacitajPolia();sablona.styl = nacitajStyl(); const a = sablona.klonuj();const b = sablona.klonuj(); a !== b;              // dva rôzne objektya.styl === b.styl;    // s rovnakým nastavením

Celý priebeh v texte (11 krokov)
  1. Prototyp je abstraktný. Vie jediné: vyrobiť svoju kópiu. Klient nebude poznať nič viac — ani jeden názov konkrétnej triedy.
  2. FormularSablona sa raz poskladá: načíta polia, doťahá štýl, nastaví sa. Presne táto práca je drahá a presne preto ju vzor nechce robiť druhýkrát.
  3. Toto je ten nastavený kus. Odteraz sa už nič nastavovať nebude — bude sa kopírovať.
  4. KlientA si vypýta objekt. Nevolá konštruktor a netuší, aká trieda to je — hovorí šablóne, nech si spraví kópiu.
  5. A tu je vzor celý: kópia vzniká vedľa originálu a vyzerá presne ako on. Rovnaký tvar, rovnaká farba — lebo je to ten istý typ s tým istým nastavením.
  6. Kópia putuje klientovi. Konštruktor sa nespustil ani raz a polia sa nenačítavali znova.
  7. KlientB chce tiež. To isté volanie, tá istá šablóna.
  8. Druhá kópia. Opäť sa nič nenastavovalo — len sa odpísalo to, čo už bolo hotové.
  9. Aj tá putuje svojmu klientovi.
  10. Originál zostal v šablóne a nezmenil sa. Kopírovanie ho neminie ani neopotrebuje — je to predloha, nie zásoba.
  11. Tri rovnaké objekty, ale nastavenie sa robilo raz. A klienti nikde nenapísali názov triedy — dostali kópiu niečoho, čo im ktosi pripravil.

Kedy použiť

  • Nastavenie objektu je drahšie než jeho skopírovanie. Šablóna sa poskladá raz a ďalšie kusy z nej vzniknú kopírovaním, nie znovu tou istou prácou.
  • Klient má vytvárať objekty, ktorých konkrétnu triedu nepozná. Dostane hotový kus, povie mu „sprav si kópiu" a nikdy nenapíše ani jeden názov triedy.
  • Variantov je veľa a líšia sa nastavením, nie správaním. Namiesto podtriedy na každý variant stačí pripravená instancia, z ktorej sa kopíruje.
  • Objekt treba vytvoriť podľa niečoho, čo existuje až za behu. Konštruktor by musel dostať všetko, čo už raz niekto poskladal — kópia to má v sebe.

Pasce

  • Plytká kópia je najčastejšia chyba vzoru. Skopírujú sa odkazy, nie obsah, takže originál a klon zdieľajú to isté vnútro — a zmena v jednom sa objaví v druhom o tri vrstvy ďalej.
  • Klonovanie obchádza konštruktor. Všetko, čo konštruktor kontroloval alebo dopočítaval, sa pri kópii nespustí, takže vzniknú objekty, aké by cez „new" nikdy neprešli.
  • Klon zdedí aj to, čo malo zostať jedinečné. Identifikátor, čas vzniku, poradové číslo — kópia ich prevezme a nikto si toho nevšimne, kým sa dva objekty netvária ako ten istý.
  • Prototyp je zdieľaný mutovateľný stav. Kto ho zmení, zmenil všetky budúce kópie — a nájsť, kto to bol, je ťažké práve preto, že sa to prejaví až na ďalších objektoch.
  • Zamieňa sa s Factory Method. Fabrika rozhoduje, ktorú triedu vytvorí; prototyp nerozhoduje o ničom, len sa kopíruje. Keď potrebujete voliť typ, toto nie je ten vzor.
  • Hlboká kópia sa zacyklí. Keď objekt priamo alebo cez vnorenie odkazuje sám na seba, naivné kopírovanie beží dovtedy, kým nedôjde pamäť.
  • Pri veľkom objekte je kópia drahšia než nový. Vzor sa oplatí podľa toho, koľko stálo nastavenie — nie podľa toho, koľko objekt zaberá.