všetky vzory

Flyweight

Zdieľa nemennú časť stavu medzi mnohými objektmi a šetrí tak pamäť.

class Glyph {  constructor(letter, font) {    this.letter = letter;    this.font = font;  }   draw(x, y) {    // draws itself at the given position  }} class GlyphFactory {  static #shared = new Map();   static forLetter(letter) {    if (!GlyphFactory.#shared.has(letter)) {      GlyphFactory.#shared.set(letter, new Glyph(letter, 'serif'));    }    return GlyphFactory.#shared.get(letter);  }} class Placement {  constructor(letter, x, y) {    this.glyph = GlyphFactory.forLetter(letter);    this.x = x;    this.y = y;  }   draw() {    this.glyph.draw(this.x, this.y);  }} const a1 = new Placement('a', 10, 4);const a2 = new Placement('a', 24, 4);const b1 = new Placement('b', 38, 4); a1.glyph === a2.glyph;   // true — the shared part is a single objecta1.x === a2.x;           // false — the own part belongs to each one

Celý priebeh v texte (12 krokov)
  1. Glyph je nemenná časť písmena: jeho tvar a font. Nezávisí od toho, kde v texte stojí — a práve preto sa dá zdieľať.
  2. Prvý výskyt písmena "a" si vypýta glyf z registra.
  3. Pre "a" ešte nič nie je, takže glyf práve teraz vzniká — jediný raz za celý text.
  4. Von neputuje kópia, ale referencia na zdieľaný glyf.
  5. A vedľa nej si výskyt drží svoju vlastnú časť: pozíciu v texte. Tú nezdieľa s nikým.
  6. Druhý výskyt toho istého písmena si tiež vypýta glyf.
  7. Register nevyrobí nič nové. Vráti referenciu na ten istý glyf, aký dostal prvý výskyt — dve lanká, jedna gulička.
  8. Vlastnú pozíciu má ale inú. Zdieľa sa nemenná časť, nie celý objekt.
  9. Tretí výskyt je iné písmeno. Pýta si glyf pre "b".
  10. Preň v registri nič nie je, tak vzniká druhý zdieľaný glyf. Koľko ich bude, určuje počet rôznych písmen — nie počet výskytov.
  11. Aj tento výskyt si drží svoju pozíciu.
  12. Tri výskyty, ale iba dva glyfy. Vlastnú časť má každý svoju, spoločnú si podávajú — a keby ich boli tisíce, glyfy by stále boli dva. To je celá úspora.

Kedy použiť

  • Tisíce znakov na stránke sa líšia pozíciou, nie tvarom písmena — a tvar stačí jeden.
  • Nemennú časť stavu možno zdieľať, meniteľná zostáva u toho, komu patrí.
  • Pamäť je úzke hrdlo, nie čas — vzor platí za miesto vyhľadaním a nepriamosťou.
  • Rovnaké objekty sa tvoria znova a znova; register ich vydá namiesto toho.

Pasce

  • Zdieľaná časť musí byť nemenná — jeden setter a zmena u jedného sa prejaví u všetkých.
  • Zamieňa sa so Singletonom. Ten má jednu instanciu na svete, tu ich je toľko, koľko hodnôt.
  • Zamieňa sa s Multitonom. Register podľa kľúča je len časť, jadrom je delenie stavu.
  • Vonkajší stav musí niekto niesť: čo ubudlo zdieľanému objektu, pribudne volajúcemu.
  • Register drží objekty navždy, takže pri veľa rôznych hodnotách sa úspora zmení na sklad.
  • Porovnanie na identitu povie „to isté" tam, kde volajúci čakal dve rôzne veci.