INTRODUCCIÓNEn este trabajo hablaremos del patrón de diseño Flyweight que usa el compartimiento para permitir un gran número de objetos de grano fino de forma eficiente, Algunas aplicaciones pueden usar objetos durante todo su diseño. La mayoría de editores de documentos tienen formato de texto y facilidades de edición que son implementados por alguna extensión. Típicamente editores de documento orientados a objetos usan objetos para representar elementos embebidos como tablas o figuras, así también utilizan objetos para representar cada carácter, manejar el editor de esta manera ofrece flexibilidad al sistema, pues pueden ser dibujados y formateados uniformemente, con figuras y tablas, pero la desventaja es que un documento de texto puede tener miles de caracteres, por eso tener un objeto por carácter implica un gran costo debido a la memoria que puede consumir. Flyweight permite compartir objetos ligeros, para hacer el programa más liviano. PATRÓN DE DISEÑO FLYWEIGHT El patrón Flyweight describe cómo compartir objetos para permitir su uso y así 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). Flyweight permite compartir objetos ligeros, para hacer el programa más liviano. Se le conoce como patrón peso ligero o patrón peso mosca. Cada objeto flyweight es dividido en dos partes: El estado dependiente (extrínseco) El estado independiente (intrínseco). El estado independiente (intrínseco).- Es almacenado (compartido) en el objeto Flyweight. El estado dependiente (extrínseco).- Es almacenado por el objeto cliente y pasado al objeto Flyweight, cuando sus operaciones son invocadas. PASOS PARA APLICAR EL PATRÓN 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 (Disminuyen requisitos de almacenamiento). El cliente (o un tercero) debe revisar los estados extrínsecos. El cliente se restringe de la crear directamente objetos Flyweight y lo solicita directamente al Factory. entonces el patrón Flyweight ofrece un apalancamiento apropiado. Strategy. Cada objeto Flyweight no puede valerse por sí mismo. Lotus y Cockroach pueden ser "livianas" porque el estado de sus instancias específicas han sido desencapsuladas o expuestas y deben ser suministradas . ESTRUCTURA Los objetos Flyweight están almacenados en un repositorio de tipo Factory.5. Cualquier atributo que pudiera hacer imposible compartir debe ser proporcionado por el cliente siempre que se realiza una solicitud al Flyweight. Si el contexto se presta para "economía a escala" (es decir. las clases Ant. y reemplazar esos estados a métodos de la clase. Ventajas: Reduce en gran cantidad el peso de los datos en un servidor. el cliente puede calcular o ver fácilmente los atributos necesarios). Desventajas: Consume un poco más de tiempo para realizar las búsquedas PATRONES RELACIONADOS Abstract Factory. Composite. El cliente debe usar la fábrica en vez de utilizar el operador new si requiere de creación de objetos 6. State. Asegurarse que la sobrecarga de objeto es un tema que necesita atención y el cliente de la clase es capaz y está dispuesto a absorber la responsabilidad de reajuste. generadores de llamada y receptores de dígitos que deben ser compartidos entre todos los suscriptores. Un suscriptor no tiene conocimiento de cuantos recursos se encuentran en el pool cuando él o ella levanta el auricular para realizar una llamada. que los dígitos sean recibidos y que la llamada sea realizada. Check list 1. Todo lo que le importa a los suscriptores es que se les proporcione el tono de marcado. Ejemplo El patrón Flyweight comparte para soportar un gran número de objetos de manera eficiente. . La red pública de conmutadores telefónicos es un ejemplo de este patrón. Hay gran cantidad de recursos tales como generadores de tono de marcado.por el cliente. GetFlyweight("X"). 5. 16. 14. Flyweight es a menudo combinado con Composite para implementar nodos compartidos. 26. 28. 9.Collections. // Wait for user . 3. 10. 18. 2. Flyweight fy = f. 4. // Work with different flyweight instances Flyweight fx = f. using System. El cliente (o un tercero) debe observar o calcular el estado no compartible y suministrar el estado a través de métodos de clase.GetFlyweight("Y"). 8. 11. 4. class MainApp { static void Main() { // Arbitrary extrinsic state int extrinsicstate = 22. 6. 5. 23. 6. using System. UnsharedConcreteFlyweight uf = new UnsharedConcreteFlyweight(). 19. 20. Facade cómo hacer un único objeto representativo de un subsistema completo. fy. FlyweightFactory f = new FlyweightFactory(). 17. fz. Crear un Factory que pueda almacenar en caché y reutilizar instancias de clases existentes. El cliente debe usar el Factory en lugar del operador new. Ejemplo de código C# 1. 15. 13. 25. Reglas de oro Mientras el patrón Flyweight muestra cómo hacer gran cantidad de pequeños objetos. fx. Quitar el estado no compartible de los atributos de clase y agregarlo como argumento de llamada a la lista de métodos afectados. 12. 22. Dividir la clase de estado de destino en: Estado compartible (intrínseco) y estado no compartible (extrínseco).2. uf.Operation(--extrinsicstate). 27.Operation(--extrinsicstate). 7. 3.GetFlyweight("Z").Operation(--extrinsicstate). 24.Operation(--extrinsicstate). Flyweight explica cómo y cuándo objetos State pueden ser compartidos. 21. Flyweight fz = f. 12. fy. 5. 31. new ConcreteFlyweight()). 1. 3.Add("Y". 33. 8. 36.Operation(--extrinsicstate). Console. 34. 30. 7.Add("X". 6. 20. 10. 39. 29. } } // "Flyweight" abstract class Flyweight { public abstract void Operation(int extrinsicstate). 27. } } // "UnsharedConcreteFlyweight" class UnsharedConcreteFlyweight : Flyweight { public override void Operation(int extrinsicstate) { Console. 24. 32. 37. 32. flyweights. 41. 18. 14. } public Flyweight GetFlyweight(string key) { return((Flyweight)flyweights[key]). 38. 34.Add("Z". 2. new ConcreteFlyweight()). 30. 4. 28. 35. // Constructor public FlyweightFactory() { flyweights.29. new ConcreteFlyweight()). 13. 19.WriteLine("UnsharedConcreteFlyweight: " + extrinsicstate). 25. 33. 31. 23. 9. flyweights. 22. } } // "FlyweightFactory" class FlyweightFactory { private Hashtable flyweights = new Hashtable().WriteLine("ConcreteFlyweight: " + extrinsicstate). 26. 11. 15. 40. } // "ConcreteFlyweight" class ConcreteFlyweight : Flyweight { public override void Operation(int extrinsicstate) { Console. 35. 21. } } . 16.Read(). 17.