Patrón Flyweight
¿Qué es el Patrón Flyweight?
El Flyweight es un patrón de diseño estructural que optimiza el uso de memoria al compartir datos comunes entre múltiples objetos similares. Es útil en sistemas con una gran cantidad de objetos que comparten características comunes.
Código de Ejemplo en JavaScript
class Flyweight {
constructor(sharedState) {
this.sharedState = sharedState;
}
operation(uniqueState) {
console.log(`Flyweight: Compartido (${JSON.stringify(this.sharedState)}), Único (${JSON.stringify(uniqueState)})`);
}
}
class FlyweightFactory {
constructor() {
this.flyweights = {};
}
getFlyweight(sharedState) {
const key = JSON.stringify(sharedState);
if (!this.flyweights[key]) {
console.log("Creando nuevo Flyweight.");
this.flyweights[key] = new Flyweight(sharedState);
}
return this.flyweights[key];
}
listFlyweights() {
console.log(`FlyweightFactory: Tengo ${Object.keys(this.flyweights).length} flyweights.`);
console.log(Object.keys(this.flyweights));
}
}
// Uso del Patrón Flyweight
const factory = new FlyweightFactory();
const sharedState1 = { type: "Círculo", color: "Rojo" };
const sharedState2 = { type: "Círculo", color: "Azul" };
const flyweight1 = factory.getFlyweight(sharedState1);
flyweight1.operation({ x: 10, y: 20 });
const flyweight2 = factory.getFlyweight(sharedState2);
flyweight2.operation({ x: 15, y: 25 });
const flyweight3 = factory.getFlyweight(sharedState1); // Reutiliza el flyweight existente
flyweight3.operation({ x: 50, y: 75 });
factory.listFlyweights();
Casos de Uso
- Sistemas gráficos que necesitan renderizar una gran cantidad de elementos similares.
- Gestión de caracteres en editores de texto donde muchos caracteres comparten estilos comunes.
- Optimización de memoria en sistemas que manejan grandes cantidades de datos repetitivos.
Patrones Relacionados
- Singleton: Garantiza una única instancia compartida, pero no está orientado a múltiples objetos similares.
- Composite: Maneja estructuras jerárquicas, mientras que Flyweight optimiza instancias individuales.
- Prototype: Crea copias de objetos, mientras que Flyweight reutiliza objetos existentes.