Flyweight (patrón de diseño)

De Wikipedia, la enciclopedia libre
Saltar a: navegación, búsqueda
Representación gráfica del Flyweight.

El patrón Flyweight (u objeto ligero) sirve para eliminar o reducir la redundancia cuando tenemos gran cantidad de objetos que contienen información idéntica, además de lograr un equilibrio entre flexibilidad y rendimiento (uso de recursos).

Problema que soluciona[editar]

Necesitamos representar gráficamente muchas pelotas idénticas que rebotan en los bordes de una ventana, así que creamos una clase que tenga por atributos las coordenadas, el radio y el color con que se dibujará la pelota.

Problema: Aunque las coordenadas son distintas, como queremos que nuestras pelotas sean iguales, el radio y el color se repetirán en cada instancia, desperdiciando memoria.

Implementación[editar]

Crear una clase PelotaFlyweight, que contendrá la información común (radio y color) y otra clase PelotaConcreta, que contendrá las coordenadas concretas de cada pelota y una referencia a un objeto de tipo PelotaFlyweight.

Al crearse instancias de PelotaConcreta, se les deberá proveer de referencias a la instancia de PelotaFlyweight adecuada a nuestras necesidades.

En este caso solamente tendríamos una instancia de PelotaFlyweight, puesto que hemos dicho que todas nuestras pelotas tienen el mismo radio y color, pero pensando en un ejemplo en el que tuviéramos varios grupos de pelotas, y dentro de cada uno de los cuales se compartieran el radio y el color, se puede utilizar Flyweight conjuntamente con el patrón Factory, de tal modo que este último, en el momento en que se le soliciten instancias de PelotaConcreta con determinadas características (mismo radio y color que el solicitado), compruebe si ya existe un PelotaFlyweight con ese radio y color, y devuelva esa referencia o, en caso de que no exista, la cree y la registre. El patrón Factory se encargaría de gestionar los PelotaFlyweight existentes.

Pasos para aplicar el patrón[editar]

1. Asegúrese que el rendimiento en los objetos es un tema primordial, y si el cliente está dispuesto a asumir el reajuste

2. Divida el objetivo principal en estados: Estado Intrínseco (elementos que se puedan compartir o son comunes) y Estado Extrínseco (elementos particulares a cada tipo)

3. Retire los elementos con estado extrínseco de los atributos de la clase, y añádale más bien una llamada a métodos

4. Crear una fábrica que pueda almacenar y reutilizar las instancias existentes de clases

5. El cliente debe usar la fábrica en vez de utilizar el operador new si requiere de creación de objetos

6. El cliente (o un tercero) debe revisar los estados extrínsecos, y reemplazar esos estados a métodos de la clase

Ventajas y Desventajas[editar]

Ventajas: Reduce en gran cantidad el peso de los datos en un servidor

Desventajas: Consume un poco más de tiempo para realizar las búsquedas

Enlaces externos[editar]