Flyweight o Peso ligero
Clasificación del patrón
Estructural
Intención
Permite gestionar eficientemente un gran número de objetos pequeños compartiendo objetos más generales. Comparte el apoyo a un gran número de objetos de grano fino de manera eficiente.
Motivación
El patrón flyweight describe como almacenar un gran número de objetos sin un gran coste.
Para conseguir esto se utilizan objetos que almacenan los estados compartidos y que pueden ser usados por varios objetos simultáneamente.
Un flyweight es un objeto compartido que se puede utilizar en varios contextos al mismo tiempo. El flyweight actúa como un objeto independiente en cada contexto. Es indistinguible para una instancia del objeto que no es compartida. Flyweight no puede hacer suposiciones sobre el contexto en el que lo operan. El concepto clave aquí es distinguen entre estado intrínseco y extrínseco. El estado intrínseco es almacenado en flyweight; y consiste en información que es independiente del contexto de flyweight, haciendo esto compartible. El estado extrínseco depende y varía con el contexto de flyweight, y por tanto no puede ser compartido. Los objetos del cliente son responsables del paso a estado extrínseco de flyweight cuando este lo necesita.
Aplicabilidad
La eficacia del patrón Flyweight depende en gran medida de cómo y dónde se utiliza. Aplicamos el patrón Flyweight cuando:
- Una aplicación usa un gran número de objetos
- Los costos de almacenamiento son altos debido al gran número de objetos
- La mayoría de objetos pueden hacerse en estado extrínseco.
- Muchos grupos de objetos se pueden sustituir por un número reducido de objetos compartidos, una vez que se elimina el estado extrínseco.
- La aplicación no depende de la identidad de los objetos.
Estructura Participantes
Flyweight. Declara una interfaz a través de la cual los flyweights pueden recibir y actuar sobre los estados no compartidos.
ConcreteFlyweight. Implementa la interfaz Flyweight y almacena los estados compartidos, si los hay. Un objeto ConcreteFlyweight debe ser compartible. Cualquier estado que almacene debe ser intrínseco; es decir, debe ser independiente de su contexto.
UnsharedConcreteFlyweight. No todas las subclases de Flyweight tienen por qué ser compartidas. La interfaz Flyweight permite que se comparta; no lo fuerza. Es común que los objetos de esta clase tengan hijos de la clase ConcreteFlyweight en algún nivel de su estructura.
FlyweightFactory
- Crea y gestiona los objetos flyweight.
- Garantiza que los objetos flyweight se comparten de forma apropiada. Cuando un cliente solicita un flyweight, el objeto de la clase FlyweightFactory proporciona una instancia existente, o crea una.
Client
- Contiene referencias a los flyweights.
- Calcula o almacena los estados no compartidos de los flyweights.
Colaboraciones
- Un objeto flyweight debe ser clasificado como compartido o no compartido. Los compartidos se almacenan en el objeto ConcreteFlyweight; los no compartidos se almacenan o se calculan en el objeto Cliente. Los clientes pasan este estado al objeto flyweight cuando invocan sus operaciones.
- Los clientes no deberían instanciar objetos de la clase ConcreteFlyweight directamente. Deben obtenerlos exclusivamente del objeto FlyweightFactory para garantizar que son compartidos apropiadamente.
Consecuencias
Flyweights puede introducir costrón en tiempo de ejecución asociados con transferencia, búsqueda y/o estados extrínsecos del computador, en especial si se almacenan anteriormente como estados intrínsecos. Sin embargo, estos costos se compensan con el ahorro de espacio, que aumenta a medida que se comparten más flyweights
El ahorro de almacenamiento está en función de varios factores:
- La reducción en el número total de instancias.
- La cantidad de estados intrínsecos por objeto.
- Si el estado extrínseco es computado o almacenado.
Cuanto más se comparte flyweights, mayor es el ahorro de almacenamiento. Los ahorros aumentan con la cantidad de estados compartidos.
El patrón flyweight es combinado con el patrón Composite.
Implementación
Consideremos las siguientes cuestiones al aplicar el patrón flyweight:
- Removiendo estado extrínsecos. La aplicabilidad del patrón determina en gran medida por lo fácil que es identificar y eliminar estados extrínsecos de objetos compartidos.
- Manejando objetos compartidos. Porque los objetos son compartidos, los clientes no deben instanciar directamente. FlyweightFactory permite a los clientes localizar un flyweight particular.
Usos Conocidos
EL concepto de objetos flyweight fue descrito por primera vez y explorado como una técnica de diseño en InterViews 3.0.
Patrones relacionados
EL patrón flyweight es a menudo combinado con Composite para aplicar una modelo de estructura jerárquica, en términos de un grafo aciclico dirigido compartiendo los nodos hoja.
A menudo es mejor implementar State y Strategy con objetos flyweight.
Referencias Bibliográficas
Design Patterns Elements of Reusable Object-Oriented Software, GoF.
http://kybele.escet.urjc.es/documentos/SI/Patrones/11_FlyWeight.ppt
http://www.ayc.unavarra.es/miguel.pagola/PesoLigero.pdf
http://gaia.fdi.ucm.es/people/pedro/das02/23flyweight.pdf
No hay comentarios:
Publicar un comentario