Padrões de projeto em Python

Flyweight Pattern in Python

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

  • Avançado
  • 3 min de leitura
  • 1 exemplo executável
O que você vai aprender
  • 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 é 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

  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 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

Executar código →
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)
Gerar um botão Run para este exemplo

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.

  1. Substitua o domínio do exemplo preservando a estrutura do padrão.
  2. Compare o padrão com uma implementação mais simples e explique as diferenças.
  3. Escreva testes para cada participante antes de adicionar outra implementação.
Executar no compilador Python →