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.
Ieșire: program TypeScript și rezultatul capturat
// Partea grea, comună — creată o singură dată pentru fiecare tip.
class TreeKind {
readonly name: string
readonly texture: string
constructor(name: string) {
this.name = name
this.texture = name + ".png"
}
}
const kinds = new Map<string, TreeKind>()
function getKind(name: string): TreeKind {
const found = kinds.get(name)
if (found !== undefined) {
return found
}
console.log("creez tipul:", name)
const kind = new TreeKind(name)
kinds.set(name, kind)
return kind
}
// Partea ușoară, specifică fiecărui arbore: o poziție și o referință.
type Tree = {
x: number
y: number
kind: TreeKind
}
const forest: Tree[] = [
{ x: 1, y: 2, kind: getKind("stejar") },
{ x: 3, y: 4, kind: getKind("pin") },
{ x: 5, y: 6, kind: getKind("stejar") },
{ x: 7, y: 8, kind: getKind("pin") },
]
console.log("arbori plantați:", forest.length)
console.log("tipuri stocate:", kinds.size)
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.