Patrón Flyweight en C#: Guía Completa con Ejemplos

Introducción: Compartir para ahorrar

Flyweight reduce el consumo de memoria compartiendo objetos que tienen el mismo estado intrínseco.

Patrón repetido
Prompt: Repeating pattern of identical leaves, minimal style, symmetric arrangement.

1. Naturaleza: Hojas idénticas

En un bosque hay miles de hojas casi iguales. No necesitas crear una definición distinta por hoja; reutilizas una plantilla.

Hojas repetidas
Prompt: Many identical leaves on a branch, macro view, soft light.

2. Mundo Real: Texto y fuentes

En un documento, cada letra "A" comparte la misma forma (estado intrínseco). Solo cambia la posición (estado extrínseco).

Texto reutilizando glifos
Prompt: Typography grid showing repeated glyphs, modern editorial style.

3. Implementación en C#: Código Paso a Paso

3.1 Flyweight

public class ArbolFlyweight
{
    public string Tipo { get; }
    public string Color { get; }
    public string Textura { get; }

    public ArbolFlyweight(string tipo, string color, string textura)
    { Tipo = tipo; Color = color; Textura = textura; }

    public void Dibujar(int x, int y)
    {
        Console.WriteLine($"Dibujando {Tipo} en ({x},{y}) color {Color}");
    }
}

3.2 Fábrica

public class ArbolFactory
{
    private Dictionary _cache = new();

    public ArbolFlyweight Obtener(string tipo, string color, string textura)
    {
        string key = $"{tipo}-{color}-{textura}";
        if(!_cache.ContainsKey(key))
            _cache[key] = new ArbolFlyweight(tipo, color, textura);
        return _cache[key];
    }
}

3.3 Uso

var factory = new ArbolFactory();
var roble = factory.Obtener("Roble", "Verde", "Rugosa");

roble.Dibujar(10, 20);
roble.Dibujar(15, 30); // mismo objeto, distinta posición

4. Flyweight vs Singleton

Singleton garantiza una sola instancia total. Flyweight reutiliza muchas instancias compartidas de tipos específicos.

5. Diagrama UML

UML Flyweight
Prompt: UML diagram of Flyweight pattern, clean vector, minimal palette.
Estado intrínseco vs extrínseco
Prompt: Diagram showing intrinsic vs extrinsic state, split layout, infographic style.

⚠️ Cuándo NO Usar Flyweight

  • Si no tienes muchos objetos repetidos.
  • Si el coste de gestionar el cache es mayor que el ahorro.

💪 Ejercicio

Simula un editor de texto que reutiliza glifos para cada letra.

Conclusión

Flyweight es clave cuando la memoria importa. Compartir estado es su superpoder.