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.
Ieșire: program Python complet
from dataclasses import dataclass
# Partea grea, comună - creată o singură dată pentru fiecare tip.
@dataclass
class TreeKind:
name: str
texture: str
kinds: dict[str, TreeKind] = {}
def get_kind(name: str) -> TreeKind:
if name in kinds:
return kinds[name]
print("se creează tipul:", name)
kind = TreeKind(name=name, texture=name + ".png")
kinds[name] = kind
return kind
# Partea ușoară, a fiecărui copac: o poziție și o referință.
@dataclass
class Tree:
x: int
y: int
kind: TreeKind
forest = [
Tree(x=1, y=2, kind=get_kind("oak")),
Tree(x=3, y=4, kind=get_kind("pine")),
Tree(x=5, y=6, kind=get_kind("oak")),
Tree(x=7, y=8, kind=get_kind("pine")),
]
print("copaci plantați:", len(forest))
print("tipuri stocate:", len(kinds))
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.