Flyweight Pattern in Python
Share the common part of thousands of small objects to save memory, keeping only what is unique per object.
- Intrinsic (shared) and extrinsic (unique) state
- A factory that reuses objects
- When the memory saving matters
first callcreates Glyph('A')second callreturns the same object → TrueShare what is the same
Flyweight è un design pattern che fa risparmiare memoria quando il programma ha bisogno di moltissimi oggetti simili. La parte di dati condivisa (per esempio la forma di un carattere) viene salvata una sola volta, mentre la parte specifica (per esempio la posizione del carattere nella pagina) viene passata a ogni utilizzo.
Punti chiave
- Shared state, such as a glyph's font data, lives in one object.
- A factory returns the existing flyweight for the same key.
- Unique state, such as position, is passed in when used.
Quando si usa?
- Risolvere problemi ricorrenti di progettazione a oggetti con strutture collaudate.
- Disaccoppiare le responsabilità per rendere il codice più facile da estendere e testare.
- Usare un vocabolario di progettazione condiviso nelle discussioni di architettura con il team.
Codice di esempio
class Glyph:
# Flyweight: share repeated intrinsic state between many uses.
def __init__(self, character): self.character = character
class GlyphFactory:
_cache = {}
def get(self, character):
# Reuse immutable intrinsic state.
return self._cache.setdefault(character, Glyph(character))
factory = GlyphFactory()
first = factory.get("A")
second = factory.get("A")
print(first is second)
print(first.character)
Risultato dell'esecuzione
True
A
Spiegazione del codice
GlyphFactory salva gli oggetti Glyph in un dizionario che fa da cache. Il metodo setdefault() crea un nuovo Glyph solo quando il carattere non è ancora nella cache. Per questo le due chiamate factory.get("A") restituiscono esattamente lo stesso oggetto, e il confronto first is second dà True.
Modifica i valori ed esegui il programma nel compilatore Python online CodeUtility senza installare Python.
Esercizi di approfondimento
Prova a modificare il codice seguendo i suggerimenti qui sotto. Cambiare il codice e osservare il risultato ti aiuta a capire molto più che leggerlo soltanto.
- Sostituisci il dominio di esempio mantenendo la struttura del pattern.
- Confronta il pattern con un’implementazione più semplice e spiegane i compromessi.
- Scrivi test per ogni partecipante prima di aggiungere un’altra implementazione.