Flyweight
Comparte estado intrínseco entre muchos objetos para soportar grandes cantidades sin agotar memoria.
Contexto
Quieres renderizar 1.000.000 de partículas, cada una con sprite, color y posición. Si guardas el sprite en cada partícula, agotas la RAM.
Problema
Distinguir lo que es intrínseco (compartible — sprite) de lo extrínseco (único — posición) y compartir lo primero.
Solución
Crea una fábrica de flyweights que reutilice instancias del estado intrínseco. Las partículas guardan solo el estado extrínseco + referencia al flyweight.
#Ejemplo en C#
public sealed record ParticleType(string Sprite, string Color); // intrínseco compartido
public class ParticleTypeFactory
{
private readonly Dictionary<(string, string), ParticleType> _pool = new();
public ParticleType Get(string sprite, string color)
{
if (!_pool.TryGetValue((sprite, color), out var t))
_pool[(sprite, color)] = t = new ParticleType(sprite, color);
return t;
}
}
public struct Particle // extrínseco
{
public float X, Y, VX, VY;
public ParticleType Type;
}Cuándo NO aplicarlo
Cuando el coste de gestionar el pool supera el ahorro o cuando los objetos son ya pequeños.
Tradeoffs
| Pro | Contra |
|---|---|
| Enorme ahorro de memoria | Código más complejo |
| Mejora locality cache | Estado intrínseco debe ser inmutable |
#structural #gof #memory