Design pattern in Python

Flyweight Pattern in Python

Share the common part of thousands of small objects to save memory, keeping only what is unique per object.

  • Avanzato
  • 3 min di lettura
  • 1 esempio eseguibile
Cosa imparerai
  • Intrinsic (shared) and extrinsic (unique) state
  • A factory that reuses objects
  • When the memory saving matters
factory.get("A") twice
first callcreates Glyph('A')
second callreturns the same object → True
1,000 letter A's on a page share one Glyph object.

Share 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

  1. Shared state, such as a glyph's font data, lives in one object.
  2. A factory returns the existing flyweight for the same key.
  3. 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

Esegui codice →
main.py
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)
Crea un pulsante Run per questo esempio

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.

  1. Sostituisci il dominio di esempio mantenendo la struttura del pattern.
  2. Confronta il pattern con un’implementazione più semplice e spiegane i compromessi.
  3. Scrivi test per ogni partecipante prima di aggiungere un’altra implementazione.
Esegui nel compilatore Python →