# 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
# 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.
# 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.