← Back to home

Flyweight

By Pscodium · 8/4/2026 · 2 views

Flyweight

O Flyweight é um padrão estrutural utilizado para reduzir o consumo de memória compartilhando objetos que possuem dados em comum.

Imagine um jogo com:

1.000.000 árvores

Cada árvore possui:

Tipo
Textura
Modelo 3D

Se cada árvore armazenar sua própria textura e modelo, podemos consumir muita memória.

Podemos compartilhar os dados que não mudam.


Estado intrínseco e extrínseco

Dividimos os dados em:

Intrínsecos

São compartilhados:

Modelo
Textura
Tipo

Extrínsecos

São específicos:

Posição
Rotação
Escala

Por exemplo:

class TreeType {
  constructor(
    public name: string,
    public texture: string
  ) {}
}

Agora criamos uma fábrica:

class TreeFactory {

  private static types =
    new Map<string, TreeType>();

  static getTreeType(
    name: string,
    texture: string
  ) {
    const key =
      `${name}-${texture}`;

    if (!this.types.has(key)) {
      this.types.set(
        key,
        new TreeType(
          name,
          texture
        )
      );
    }

    return this.types.get(key)!;
  }
}

Criamos árvores:

const oak =
  TreeFactory.getTreeType(
    "Oak",
    "oak.png"
  );

const tree1 = {
  type: oak,
  x: 10,
  y: 20
};

const tree2 = {
  type: oak,
  x: 100,
  y: 200
};

As árvores compartilham:

Oak
oak.png

Mas possuem posições diferentes.


Visualmente

Tree 1 ──┐
          ├──→ TreeType
Tree 2 ──┤      Oak
          │      oak.png
Tree 3 ──┘

Milhares de objetos podem compartilhar a mesma estrutura.


Quando usar?

Flyweight é útil quando:

  • Existem muitos objetos semelhantes.
  • Os objetos consomem muita memória.
  • Grande parte dos dados pode ser compartilhada.
  • Temos grandes quantidades de objetos em memória.

Exemplos:

Jogos
Mapas
Renderização
Editor de texto
Sistemas gráficos

A ideia principal é:

Compartilhar partes comuns de objetos para reduzir consumo de memória.



Comments

No comments yet.