Flyweight es un patrón de diseño estructural que permite a los programas soportar grandes cantidades de objetos manteniendo un bajo uso de memoria.
El patrón lo logra compartiendo partes del estado del objeto entre varios objetos. En otras palabras, el Flyweight ahorra memoria RAM guardando en caché la misma información utilizada por distintos objetos.
Ejemplos de uso: El patrón Flyweight se utiliza en muy raras ocasiones en aplicaciones PHP debido a la propia naturaleza del lenguaje. Un script PHP trabaja normalmente con una parte de la información de la aplicación y nunca lo carga entero en la memoria al mismo tiempo.
Identificación: El patrón Flyweight puede reconocerse por un método de creación que devuelve objetos guardados en caché en lugar de crear objetos nuevos.
Ejemplo conceptual
Este ejemplo ilustra la estructura del patrón de diseño Flyweight y se centra en las siguientes preguntas:
¿De qué clases se compone?
¿Qué papeles juegan esas clases?
¿De qué forma se relacionan los elementos del patrón?
Después de conocer la estructura del patrón, será más fácil comprender el siguiente ejemplo basado en un caso de uso real de PHP.
index.php: Ejemplo conceptual
Output.txt: Resultado de la ejecución
Ejemplo del mundo real
Antes de empezar, observa que las aplicaciones reales del patrón Flyweight en PHP son muy escasas. Esto surge de la naturaleza de hilo único de PHP, donde no se debe almacenar TODOS los objetos de tu aplicación en la memoria al mismo tiempo, en el mismo hilo. Aunque la idea de este ejemplo solo es ligeramente grave y el problema de memoria RAM se puede solucionar estructurando la aplicación de forma diferente, aún demuestra el concepto del patrón en el mundo real. De acuerdo, ya avisé. Ahora, comencemos.
En este ejemplo, el patrón Flyweight se utiliza para minimizar el uso de memoria RAM de objetos en una base de datos de animales de una clínica veterinaria exclusiva para gatos. Cada registro de la base de datos está representado por un objeto Gato. Su información consta de dos partes:
Información única (extrínseca) como el nombre, la edad e información del dueño.
Información compartida (intrínseca), como el nombre de la raza, color, textura, etc.
La primera parte se almacena directamente dentro de la clase Gato, que actúa como contexto. Sin embargo, la segunda parte se almacena por separado y pueden compartirla varios gatos. Esta información compartible reside dentro de la clase VariacióndeGato. Todos los gatos que tienen características similares están vinculados a la misma clase VariacióndeGato, en lugar de almacenar la información duplicada en cada uno de sus objetos.