Dedicado a mis proyectos en Gambas ,un lenguaje de programación parecido al Visual Basic + Java pero ampliamente mejorado y...¡¡para gnu/linux!!.La potencia del gnu/linux sumada a la facilidad del Basic



Consultas, Desarrollo de programas y petición de presupuestos:



viernes, 3 de enero de 2014

Patrón Flyweight. Ejemplo Formatos de tipo de letra y tamaño


Patrón Flyweight


Motivo 
Este patrón comparte estados para soportar un gran número de objetos pequeños aumentando la eficiencia en espacio. [Gamma,1995]

Algunas aplicaciones pueden usar objetos durante todo su diseño, pero esto puede ocasionar implementaciones costosas. Ejemplo: La mayoría de editores de documentos tienen formato de texto y facilidades de edición que son implementados por alguna extensión. Típica mente 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. Para conseguir esto se utilizan objetos que almacenan los estados compartidos y que pueden ser usados por varios objetos simultáneamente. Los objetos pueden compartir estados intrínsecos que no dependen del contexto, pero no pueden compartir los estados extrínsecos que dependen del contexto

  • El estado intrínseco es almacenado en el objeto.
  • El estado extrínseco es pasado (contexto) como parámetro en las operaciones.



Aplicabilidad 

La efectividad de este patrón depende de cómo y cuándo es utilizado, por eso es importante implementarlo siempre que todas las siguientes situaciones se cumplan: 
  • Una aplicación usa un gran número de objetos. 
  • El coste de almacenamiento es alto debido al excesivo número de objetos. 
  •  La gran mayoría de los estados de los objetos puede hacerse extrínseco. 
  • Al separar el estado extrínseco, muchos grupos de objetos pueden reemplazarse por unos pocos objetos compartidos. 
  • La aplicación no depende de la identidad de los objetos, pues el patrón se basa en el compartimento de objetos. 


Implementación:

  1. 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.
  2. Dividir la clase de estado de destino en: Estado compartible (intrínseco) y estado no compartible (extrínseco).
  3. Quitar el estado no compartible de los atributos de clase y agregarlo como argumento de llamada a la lista de métodos afectados.
  4. Crear un Factory que pueda almacenar en caché y reutilizar instancias de clases existentes.
  5. El cliente debe usar el Factory en lugar del operador new.
  6. 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.


Relación con otros patrones
Mientras el patrón Flyweight muestra cómo hacer gran cantidad de pequeños objetos, Facade cómo hacer un único objeto representativo de un subsistema completo.
Flyweight es a menudo combinado con Composite para implementar nodos compartidos.
Flyweight explica cómo y cuándo objetos State pueden ser compartidos.

Diagrama UML:



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.


Ejemplo: Formatos de tipo de letra y tamaño.
En este ejemplo se reciben varios tipos de letras, tamaño y texto. El programa se encargará de crear las clases formatos,  donde almacenará los distintos tipos de letras y tamaños.
Esquema de clases:

Esquema del proyecto:



Clase CreaLetra
->

Clase Formato
->

Clase FormatoFactory
->

Clase Letra
->

Clase TestFlyWeight
->

Programa Principal:
->


Salida del programa por consola:
->

Fuente: archivo almacenado en box.com

http://modelosprogramacion.blogspot.com.es/2009/05/flyweight.html
http://adrysmodelos.blogspot.com.es/2009/05/patron-de-diseno-flyweight-abstract.html -> ejemplo de caracteres
http://programacionsolida.com.ar/2012/03/patrones-de-diseno-estructurales_22.html