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