El propósito de usar el patrón de peso mosca es evitar la inicialización innecesaria de objetos y así ahorrar espacio. Según lo definido por GOF , un objeto puede tener dos estados, el estado intrínseco y el extrínseco:
- Estado intrínseco: se almacena en el peso mosca; consiste en información que es independiente del contexto de los pesos mosca, por lo que es compartible.
- Estado extrínseco: depende y varía según el contexto del peso mosca y, por lo tanto, no se puede compartir. Los objetos del cliente son responsables de pasar el estado extrínseco al peso mosca cuando lo necesita.
Suponiendo que queremos desarrollar una aplicación de editor de texto simple donde cada columna contiene todas las filas del texto y la fila puede contener caracteres.
El dilema aquí es cómo diseñar la clase de personaje. El char cdentro de la clase de caracteres debería ser la principal (estado intrínseca) objeto. Sin embargo, un carácter puede tener una fuente y un tamaño (estado extrínseco); por lo tanto, necesitamos almacenar su estado extrínseco en la fila (cliente) y acceder a él cuando sea necesario. Para este propósito, se crean dos listas que almacenan las fuentes y los tamaños.
Siguiendo el patrón Flyweight, el personaje ahora es reutilizable y los objetos se referencian desde una lista específica de objetos (el grupo de peso mosca) que contiene todos los símbolos ( Characterobjetos) ASCII .
Esto es lo que describí visualmente:

Para imprimir 'hola', solo Characterse necesitan 4 objetos, en lugar de 5. Una vez que se cambia la fuente, no se requieren objetos nuevos; tenga en cuenta que esto no sería posible si hubiéramos almacenado el estado extrínseco en la clase Carácter, por ejemplo,
class Character
{
char c;
int Size;
Font font;
....
}
La aplicación de este patrón en grandes conjuntos de datos conduciría a optimizaciones significativas en la complejidad de la memoria de la aplicación y la reutilización de objetos.