El patrón peso mosca es un patrón de diseño estructural que te permite colocar más objetos en la cantidad de RAM disponible al compartir partes comunes del estado entre varios objetos en lugar de mantener todos los datos en cada objeto. Este patrón es simplemente una optimización.
¿Qué problema resuelve el patrón peso mosca?
El patrón peso mosca resuelve, por ejemplo, el problema de insuficiente cantidad de RAM en una aplicación o videojuego con muchas partículas (balas, misiles, trozos de metralla, etc..) representadas por un objeto separado con muchos datos.
Este patrón sugiere que dejes de almacenar estados extrínsecos dentro de los objetos. La alternativa es pasar estos estados a métodos específicos que se basen en ellos.
Solo el estado intrínseco permanece dentro del objeto, permitiéndote reutilizarlo en diferentes contextos. Con esto, necesitarías menos de estos objetos. Un objeto que solo almacena el estado intrínseco se llama peso mosca.
¿Cuándo usar el patrón peso mosca (Flyweight)?
Deberías usar el patrón peso mosca solo cuando tu programa debe permitir una gran cantidad de objetos que apenas caben en la memoria RAM disponible.
Recuerda que el patrón es más útil cuando una aplicación necesita generar una gran cantidad de objetos similares, agota toda la memoria RAM disponible en un dispositivo de destino y/o los objetos contienen estados duplicados que se pueden extraer y compartir entre varios objetos.
Pros y contras del patrón peso mosca
Los siguientes son algunos de los “pros y cons” de este patrón:
“Show me the code”
Si quieres tener una idea más práctica de cómo funciona este patrón, puedes ver un ejemplo en PHP de refactoring.guru.
Este patrón es muy poco popular en PHP, y se usa muy raramente en aplicaciones PHP debido a la naturaleza del lenguaje. Como bien recuerdas, un script de PHP normalmente funciona con una parte de los datos de la aplicación y nunca los carga todos en la memoria al mismo tiempo.
Por tanto, en el ejemplo real, podrás ver cómo el patrón peso mosca se usa para minimizar el uso de RAM de objetos en una base de datos de animales de una clínica veterinaria solo para gatos.
Cada registro está representado por un objeto Cat, y sus datos constan de datos únicos (extrínsecos) y datos compartidos (intrínsecos). Los datos únicos se almacenan dentro de la clase Cat, es el contexto, mientras que los datos compartidos se almacenan por separado y pueden ser compartidos por varios gatos.
¿Utilizas el patrón Flyweight en tus proyectos? ¿Qué tal la experiencia? ¡Coméntalo abajo!
Fuente: