Treci la conținutul principal

Ce este

Șablonul Flyweight economisește memorie atunci când un program ține mii de obiecte similare: partea grea, partajată, este stocată o singură dată și referită de oriunde, î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 specii de arbori și de 10.000 de înregistrări minuscule (x, y, specie).


Exemplu: o pădure cu specii partajate

KindCache::get() distribuie obiecte-specie partajate, creând fiecare dintre ele doar la prima cerere. Fiecare arbore stochează doar o poziție și o referință la specia lui.

Mulți arbori, puține specii

Patru arbori, dar „se creează specia” se afișează doar de două ori — oak și pine există câte o singură dată, indiferent cât de mare devine pădurea. În PHP obiectele se transmit prin referință (handle), așa că fiecare arbore oak indică exact același TreeKind.

Prompt
Scrie un script PHP cu șablonul Flyweight: o clasă grea TreeKind (name, texture) stocată o singură dată pentru fiecare specie într-un tablou static, în spatele unei metode KindCache::get() care afișează un mesaj când creează o specie, și obiecte Tree ușoare care păstrează doar o poziție și o referință la specia lor. Plantează patru arbori de două specii și afișează câți arbori există față de câte specii au fost stocate.
Ieșire: script PHP

Când să îl folosești

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

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


Avantaje și dezavantaje

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

Dezavantaje: obiectele partajate trebuie tratate ca fiind doar pentru citire — o singură scriere neatentă schimbă „fiecare stejar din pădure”; împărțirea în parte partajată și parte unică complică modelul.