Treci la conținutul principal

Ce este

Șablonul Flyweight economisește memorie atunci când un program ține mii de obiecte similare: partea grea, comună, este stocată o singură dată și referită peste tot, în timp ce fiecare obiect păstrează doar mica sa parte unică.

O pădure de 10.000 de arbori nu are nevoie de 10.000 de texturi — are nevoie de 2 tipuri de arbore și de 10.000 de înregistrări minuscule (x, y, tip).


Exemplu: o pădure cu tipuri comune

getKind() returnează obiecte de tip comune dintr-un Map, creând fiecare obiect doar la prima cerere. Fiecare arbore stochează doar o poziție și o referință.

Mulți arbori, puține tipuri

Patru arbori, dar creez tipul se afișează doar de două ori — stejarul și pinul există câte o singură dată, oricât de mare ar deveni pădurea. Ultimele două linii afișează arbori plantați: 4 și tipuri stocate: 2.

Prompt
Scrie un program TypeScript cu șablonul Flyweight: o clasă grea TreeKind (nume, textură) stocată o singură dată per tip într-un Map, în spatele unei funcții getKind care afișează un mesaj atunci când creează un tip, și obiecte Tree ușoare care păstrează doar o poziție și o referință către tipul lor. Plantează patru arbori de două tipuri și afișează câți arbori există față de câte tipuri au fost stocate.
Ieșire: program TypeScript și rezultatul capturat

Când să îl folosești

Folosește-l atunci când măsurătorile arată probleme de memorie cauzate de multe obiecte care repetă date grele — dale de hartă, glife, particule, stiluri păstrate în cache.

Renunță la el sub câteva mii de obiecte sau când partea comună este mică. Acesta este un șablon de optimizare: fără problema de memorie, el înseamnă doar complexitate.


Avantaje și dezavantaje

Avantaje: economii mari de memorie la scară largă; datele comune se actualizează într-un singur loc.

Dezavantaje: obiectele comune trebuie tratate ca fiind doar pentru citire — o singură scriere neatentă schimbă „fiecare stejar din pădure” (marcarea câmpurilor comune cu readonly ajută); împărțirea în parte comună și parte unică complică modelul.