He estado estudiando patrones de diseño y me encontré con el patrón de peso de la mosca. He estado tratando de ver oportunidades para usar el patrón en mis aplicaciones, pero tengo problemas para ver cómo usarlo. Además, ¿cuáles son algunas señales de que se está utilizando un patrón de peso de mosca cuando leo el código de otras personas?
Según la definición dice:
Use el uso compartido para admitir grandes cantidades de objetos de grano fino de manera eficiente.
Si lo leí bien, los diccionarios y las tablas hash podrían ser instancias de pesas de vuelo, ¿es correcto?
Gracias por adelantado.
design-patterns
Jeremy E
fuente
fuente
Respuestas:
Un ejemplo está en las bibliotecas de Java. Java tiene tipos primitivos (p
int
. Ej. , Que es un entero de 32 bits) y envoltorios para ellos (pInteger
. Ej. , Que se ajustaint
). Hay métodos para "encajonar" unint
en unInteger
y unbox unInteger
en unint
. Los envoltorios son necesarios porque los tipos primitivos no son objetos y, por lo tanto, no se pueden usar, por ejemplo, como claves enMap
s ni se pueden colocar enCollection
s.El método de boxeo utiliza una matriz de objetos de peso mosca como una especie de caché para
Integer
s correspondientes aint
valores entre -128 y 127. Dado que esos son los valores que más probablemente se usarán como claves o se colocarán en colecciones, reduce la asignación y el uso de memoria. (Si hay 5000000Integer
s que representan el valor 0 flotando, eso usa 5000000 veces más memoria que reutilizando la instancia de peso mosca).fuente
Gráficos. Por lo general, una imagen de trama (que es la columna vertebral de la mayoría de los gráficos de computadora de nivel de consumidor) es barata para la CPU, pero costosa para la memoria de trabajo (lo cual está bien porque la memoria es barata pero la CPU es costosa). Si esa imagen ráster se repetirá muchas veces al representar una interfaz de usuario más grande (desde iconos en una aplicación GUI de Windows hasta caracteres de una fuente en un procesador de texto, texturas en superficies en un juego 3D), tiene mucho sentido cargue la imagen en la memoria una vez y simplemente apúntela usando objetos muy simples que sean baratos de hacer y que, por sí mismos, no consuman mucha memoria. Un sprite, que es simplemente un punto en el espacio gráfico en el que se debe mostrar una imagen, es solo un punto 3D y un puntero de memoria al primer píxel de la imagen a utilizar. TAL VEZ también incluye las dimensiones de la porción del archivo de imagen de sprite que se utilizará, ya sea en términos gráficos o de memoria. Esta información es muy económica de cambiar, por ejemplo, para cambiar la imagen o la ubicación del sprite, y se puede hacer sin cargar una nueva imagen cada vez, lo que aumenta drásticamente el rendimiento del programa subyacente para manipular y mostrar las partes adecuadas de la imagen. imágenes adecuadas para representar una "escena" de IU completa.
fuente
Las
Character
instancias de rango ASCII en Smalltalk son pesos mosca.Cuando evalúas algo como
Character space
,Character class >> #value:
ejecuta:La variable de clase
CharacterTable
se inicializa así:Entonces, cuando crea una Cadena, el rango ASCII
Character
vendrá enCharacterTable
lugar de ser creado nuevamente cada vez.fuente
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:
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 c
dentro 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 (
Character
objetos) ASCII .Esto es lo que describí visualmente:
Para imprimir 'hola', solo
Character
se 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,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.
fuente