El patrón Flyweight comparte el estado común entre muchos objetos para reducir el uso de memoria.
1. El Problema de Partida
getCollection('knowledge', 'es') puede devolver cientos de posts. Si cada objeto post copiara internamente el objeto completo de su categoría ({ id, title, description, image, intro } de _category.json), tendríamos esa misma información duplicada cientos de veces en memoria durante el build estático — cuando en realidad solo hay ~10 categorías reales.
2. La Solución Flyweight
// src/lib/CategoryFlyweightFactory.js
class CategoryFlyweightFactory {
static pool = new Map();
static get(categoryId, categoriesData) {
if (!this.pool.has(categoryId)) {
// El objeto de categoría (intrínseco, inmutable) se crea UNA sola vez
const data = categoriesData.find((c) => c.id === categoryId);
this.pool.set(categoryId, data);
}
return this.pool.get(categoryId);
}
}
export default CategoryFlyweightFactory;3. Uso al construir la lista de posts
// src/lib/mdx.js
import CategoryFlyweightFactory from './CategoryFlyweightFactory';
export function getCollection(type, lang) {
const categoriesData = getCategories(type, lang);
const rawPosts = getAllMdxFiles(/* ... */);
return rawPosts.map((raw) => {
const meta = parseFrontmatter(raw);
return {
...meta,
// Todos los posts de "design-patterns" comparten la MISMA referencia de categoría
category: CategoryFlyweightFactory.get(meta.category, categoriesData),
};
});
}4. Ventajas
- Una sola instancia de categoría en memoria, sin importar cuántos posts la referencien (17 posts de
design-patternsapuntan al mismo objeto). - Consistencia automática: si se actualiza el título de una categoría, todos los posts lo reflejan de inmediato al compartir referencia.
- Menor huella de memoria durante
generateStaticParams, donde se procesan todas las rutas del sitio a la vez.