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 é um padrão de projeto que economiza memória quando o programa precisa de muitos objetos parecidos. A parte compartilhada dos dados (por exemplo, o desenho de um caractere) é guardada uma única vez, e a parte específica (por exemplo, a posição do caractere na página) é passada a cada uso.
Pontos-chave
- 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 usar?
- Resolver problemas recorrentes de design de objetos com estruturas comprovadas.
- Desacoplar responsabilidades para facilitar a extensão e os testes do código.
- Usar um vocabulário de design comum ao discutir arquitetura com a equipe.
Código de exemplo
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)
Resultado da execução
True
A
Explicação do código
GlyphFactory guarda os objetos Glyph em um dicionário que funciona como cache. O método setdefault() só cria um novo Glyph quando o caractere ainda não está no cache. Por isso, as duas chamadas factory.get("A") retornam exatamente o mesmo objeto, e a comparação first is second resulta em True.
Altere os valores e execute o programa no compilador Python online CodeUtility sem instalar Python.
Exercícios práticos
Tente modificar o código seguindo as sugestões abaixo. Mudar o código e observar o resultado ajuda você a entender muito mais do que só ler.
- Substitua o domínio do exemplo preservando a estrutura do padrão.
- Compare o padrão com uma implementação mais simples e explique as diferenças.
- Escreva testes para cada participante antes de adicionar outra implementação.