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.