všetky vzory

Prototype

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

class Prototype {  clone() { throw new Error('abstraktná metóda'); }} class FormTemplate extends Prototype {  constructor() {    super();    this.fields = [];    this.style = null;  }   clone() {    const copy = new FormTemplate();    copy.fields = [...this.fields];    copy.style = this.style;    return copy;  }} // The setup is expensive and happens once.const template = new FormTemplate();template.fields = loadFields();template.style = loadStyle(); const a = template.clone();const b = template.clone(); a !== b;                 // two different objectsa.style === b.style;     // with the same setup

Celý priebeh v texte (11 krokov)
  1. Prototype je abstraktný. Vie jediné: vyrobiť svoju kópiu. Klient nebude poznať nič viac — ani jeden názov konkrétnej triedy.
  2. FormTemplate 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. ClientA 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. ClientB 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.
  • Klient dostane hotový kus, povie mu „sprav si kópiu" a nikdy nenapíše názov triedy.
  • Variantov je veľa a líšia sa nastavením, nie správaním — namiesto podtried stačí instancia.
  • Predloha vzniká až za behu; konštruktor by musel dostať všetko, čo už raz niekto poskladal.

Pasce

  • Plytká kópia zdieľa s originálom vnútro, takže zmena v jednom sa objaví v druhom.
  • Klonovanie obchádza konštruktor, takže vzniknú objekty, aké by cez „new" neprešli.
  • Klon zdedí aj identifikátor či čas vzniku a dva objekty sa tvária ako ten istý.
  • Prototyp je zdieľaný mutovateľný stav: kto ho zmení, zmenil všetky budúce kópie.
  • Factory Method volí triedu, prototyp sa len kopíruje — na voľbu typu to nie je ten vzor.
  • Hlboká kópia sa pri odkaze na seba zacyklí, kým nedôjde pamäť.
  • Vzor sa oplatí podľa ceny nastavenia, nie podľa veľkosti objektu.