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:

Pros

Contras

  • Puedes ahorrar mucha RAM, suponiendo que tu programa tenga toneladas de objetos similares.

  • Es posible que estés intercambiando RAM por ciclos de CPU cuando algunos de los datos de contexto deben volver a calcularse cada vez que alguien llama a un método de peso mosca.

  • El código se vuelve mucho más complicado. 

“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:

Compartir es construir