Treci la conținutul principal

Ce este

Șablonul Flyweight economisește memorie atunci când un program păstrează mii de obiecte asemănătoare: partea grea, comună, este stocată o singură dată și referită peste tot, iar fiecare obiect păstrează doar partea sa mică, unică.

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


Exemplu: o pădure cu tipuri comune

get_kind() oferă obiecte-tip comune dintr-un cache simplu de tip dicționar și creează fiecare tip doar la prima cerere. Fiecare copac stochează doar o poziție și o referință.

Mulți copaci, puține tipuri

Patru copaci, dar „se creează tipul” se afișează doar de două ori — oak și pine există câte o singură dată, oricât de mare ar deveni pădurea.

Prompt
Scrie un program Python cu șablonul Flyweight: o clasă de date grea TreeKind (name, texture), stocată o singură dată pentru fiecare tip într-un dicționar din spatele unei funcții get_kind, care afișează un mesaj când creează un tip, și clase de date ușoare Tree care păstrează doar o poziție și o referință către tipul lor. Plantează patru copaci de două tipuri și afișează câți copaci există față de câte tipuri au fost stocate.
Ieșire: program Python complet

Când să-l folosești

Folosește-l atunci când măsurătorile arată probleme de memorie din cauza multor obiecte care repetă date grele — dale de hartă, glife, particule, stiluri memorate î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 aduce doar complexitate.


Avantaje și dezavantaje

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

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