terminal

codeando_simple

terminal

menu

terminal

search_module

guest@codeandosimple: ~/system/search $ grep -r "" .

Press [ENTER] to execute search

Status

Engine: Ready

Database: Online

Index: V2.1.0_LATEST

bash — cat flyweight.md
guest@codeandosimple: ~/blog/design-patterns $ cat flyweight.md

Patrón Flyweight_

// "La vida es como montar en bicicleta. Para mantener el equilibrio, debes seguir adelante" - Albert Einstein

# Propósito

El patrón Flyweight (Peso ligero) se basa en la idea de compartir objetos que se repiten, en vez de crear una nueva instancia de cada uno.

Esto optimiza el uso de memoria ya que elimina la redundancia de objetos con propiedades idénticas.

# Problema

Uso excesivo y sobrecarga de memoria debido a la creación de un gran número de objetos que tienen casi el mismo estado (redundancia).

# Solución

La solución que propone el Flyweight es:

  • Separación de Datos: Almacena datos comunes (intrínsecos) en flyweights y pasa datos específicos (extrínsecos) a través de métodos.

  • Reutilización: Permite usar objetos en diferentes contextos evitando crear nuevos.

# Estructura

Estructura UML Flyweight

# Participantes

  • Flyweight: Interfaz para recibir estado extrínseco.
  • ConcreteFlyweight: Almacena el estado intrínseco (compartido).
  • UnsharedConcreteFlyweight: Almacena estado extrínseco.
  • FlyweightFactory: Gestiona y asegura el compartido.
  • Client: Mantiene referencias y calcula estados extrínsecos.

# Cuándo Usarlo

  • Muchos objetos con estados similares que pueden ser compartidos.

  • Necesidad crítica de reducir la carga de memoria.

# Ventajas

  • verified

    Eficiencia Memoria: Reduce significativamente el consumo.

  • verified

    Mejor Rendimiento: Especialmente en sistemas con restricciones.

# Desventajas

  • warning

    Complejidad: Diseño más difícil de implementar.

  • warning

    Overhead CPU: Manejar estados extrínsecos puede costar tiempo.

# Ejemplo: Juego de Ajedrez

Gestionamos eficientemente las piezas del tablero. Muchas piezas (peones) comparten el mismo color pero tienen posiciones diferentes.

Ejemplo Flyweight Ajedrez

# Código Java

class ChessPieceFactory {
    private static final Map PIECES = new HashMap<>();

    public static ChessPiece getChessPiece(String color) {
        PIECES.computeIfAbsent(color, c -> new Pawn(c));
        return PIECES.get(color);
    }
}

class Pawn implements ChessPiece {
    private String color; // intrínseco
    public void draw(Position pos) { // pos: extrínseco
        System.out.println("Pawn " + color + " at " + pos);
    }
}

# Mapeo Participantes

  • ChessPiece (Flyweight): Interfaz común.
  • Pawn (ConcreteFlyweight): Almacena el color.
  • Position (Unshared): Coordenadas x,y.
  • ChessPieceFactory (Factory): Reutiliza instancias.

# Conclusiones

Permite un uso eficiente de memoria y mejora el rendimiento al compartir piezas comunes mientras se mantiene el estado específico de cada una por separado.

# Patrones relacionados

Composite

Se puede combinar para implementar estructuras lógicas jerárquicas.

State y Strategy

Suele ser mejor implementarlos como pesos ligeros.