FLY WEIGHT |
1. CLASIFICACIÓN DEL PATRÓN
Patrón Estructural.
2. INTENCIÓN
Utiliza la distribución para apoyar una gran cantidad de objetos de grano fino eficientemente.
3. MOTIVACIÓN
Algunos usos podían beneficiarse de usar objetos a través de su diseño, pero una puesta en práctica ingenua sería prohibitivo costosa.
Por ejemplo, la mayoría de las puestas en práctica del redactor del documento tienen el formato de texto y medios de compaginación que se modularizan hasta cierto punto. Redactores orientados al objeto del documento utilice típicamente los objetos para representar elementos encajados como las tablas y las figuras. Sin embargo, detienen justo antes generalmente el usar de un objeto para cada carácter en documento, aunque el hacer tan promovería flexibilidad en los niveles más finos en el uso. Los caracteres y los elementos encajados podían entonces ser tratados uniformemente con respecto a cómo se dibujan y se dan formato. El uso se podía ampliar para apoyar nuevos juegos de caracteres sin disturbar la otra funcionalidad. La aplicación de la estructura del objeto podría copiar la estructura física del documento. El diagrama siguiente demuestra cómo un redactor del documento puede utilizar objetos para representar caracteres.
4. POSIBLES APLICACIONES PARA EL FLY WEIGHT.
Se debe usar el patrón Fly Weight cuando:
· Un uso utiliza una gran cantidad de objetos
· Los costes de almacenaje son altos debido a la cantidad escarpada de objetos.
· La mayoría del estado de objeto se puede hacer extrínseco.
· Muchos grupos de objetos se pueden substituir por relativamente pocos objetos compartidos una vez que se quita el estado extrínseco.
· El uso no depende de identidad del objeto. Puesto que los objetos del flyweight pueden ser compartidos, las pruebas de la identidad volverán verdad para conceptual distinto objetos.
5. ESTRUCTURA
La estructura básica que maneja el Flyweight está compuesta por:
Fig. 1. Diagrama de clases del modelo de uso del Flyweight.
6. PARTICIPANTES
· Fly Weight: declara una interface por la cual Flyweight puede recibir y actuar en un estado extrínseco.
· ConcreteFlyweight: implementa la interfaz del flyweight adhiere un almacenaje para el estado intrínseco, si lo hay. Un objeto concreteflyweight debe ser compartible. Cualquier estado que guarde debe ser intrínseco; es decir, debe depender del contexto del objeto de concreteflyweight.
· UnsharedConcrteFlyweight: no todas las subclases del flyweight necesitan ser compartidas. La interfaz del flyweight hace posible el intercambio; no lo forza. Es común para objetos UnsharedConcreteFlyweight tener objetos ConcreteFlyweight como hijos en algún nivel de la estructura del objeto flyweight.
· FlyweightFactory: crea y maneja los objetos flyweight. Asegura que los flyweights sean compartidos apropiadamente. Cuando el cliente requiere un flyweight, el objeto de la factoría suple una instancia existente o crea una, si no hay alguna ya creada.
· Client: mantiene una referencia de flyweight (s), computa o guarda el estado extrínseco de flyweight (s).
7. COLABORACIONES
Indique que un flyweight necesita funcionar debe ser caracterizado como intrínseco o extrínseco. El estado intrínseco se almacena en los patrones del diseño de ConcreteFlyweight objeto; el estado extrínseco es almacenado o computado por los objetos de Client. Los clientes pasan este estado al flyweight cuando invocan sus operaciones.
Los clientes no deben ejemplificar ConcreteFlyweights directamente. Los clientes deben obtener los objetos de ConcreteFlyweight exclusivamente del objeto de FlyweightFactory para asegurarse que los comparten correctamente.
8. CONSECUENCIAS
Los flyweights pueden introducir los costes run-time asociados a la transferencia, a encontrar, y/o al estado extrínseco computacional, especialmente si fue almacenado antes como estado intrínseco.
Sin embargo, tales costes son compensados por los ahorros de espacio, que aumentan mientras que comparten a más flyweights. Los ahorros del almacenaje son una función de varios factores:
· la reducción en el número total de casos que viene de la distribución · la cantidad de estado intrínseco por objeto
· si el estado extrínseco está computado o almacenado. Comparten a más flyweights, mayores son los ahorros del almacenaje. Los ahorros aumentan con la cantidad de estado compartido.
Los ahorros más grandes ocurren cuando los objetos utilizan cantidades substanciales de estado intrínseco y extrínseco, y el estado extrínseco se puede computar algo que almacenado. Entonces usted excepto en almacenaje de dos maneras: La distribución reduce el coste del estado intrínseco, y usted negocia el estado extrínseco por tiempo del cómputo.
9. IMPLEMENTACIÓN
Para la implementación del Flyweight es recomendable usar algunas “técnicas” para facilitar su uso.
· Eliminación del estado extrínseco. El patrón aplicabilidad es determinado en gran parte por cómo es fácil es identificar el estado extrínseco y quitarlo de objetos compartidos. Eliminación del estado extrínseco no ayuda a reducir costes de almacenaje si hay tantas diversas clases de estado extrínseco pues hay objetos antes de compartir. Idealmente, el estado extrínseco se puede computar de una estructura separada del objeto, una con requisitos de almacenaje lejos más pequeños. Los ahorros del almacenaje son una función de varios factores: · la reducción en el número total de casos que viene de la distribución · la cantidad de estado intrínseco por objeto · si el estado extrínseco está computado o almacenado. Comparten a más flyweights, mayores son los ahorros del almacenaje. Los ahorros aumentan con la cantidad de estado compartido. Los ahorros más grandes ocurren cuando los objetos utilizan cantidades substanciales de estado intrínseco y extrínseco, y el estado extrínseco se puede computar algo que almacenado. Entonces usted excepto en almacenaje de dos maneras: La distribución reduce el coste del estado intrínseco, y usted negocia el estado extrínseco por tiempo del cómputo.
· Objetos compartidos de manejo. Porque se comparten los objetos, los clientes no los ejemplifica directamente. FlyweightFactory deja a clientes localizar a flyweight particular. Los objetos de FlyweightFactory utilizan a menudo un almacén asociativo para dejar a clientes mirar para arriba a flyweights del interés. Por ejemplo, la fábrica del flyweight en el ejemplo del redactor del documento puede guardar una tabla de flyweights puestos en un índice por códigos de carácter. El encargado vuelve al flyweight apropiado dado su código, creando al flyweight si no existe ya.
10. CÓDIGO DE EJEMPLO
class Glyph {
public:
virtual ~Glyph();
virtual void Draw(Window*, GlyphContext&);
virtual void SetFont(Font*, GlyphContext&);
virtual Font* GetFont(GlyphContext&);
virtual void First(GlyphContext&);
virtual void Next(GlyphContext&);
virtual bool IsDone(GlyphContext&);
virtual Glyph* Current(GlyphContext&);
virtual void Insert(Glyph*, GlyphContext&);
virtual void Remove(GlyphContext&);
protected:
Glyph();
};
class Character : public Glyph {
public:
Character(char);
virtual void Draw(Window*, GlyphContext&);
private:
char _charcode;
};
class GlyphContext {
public:
GlyphContext();
virtual ~GlyphContext();
virtual void Next(int step = 1);
virtual void Insert(int quantity = 1);
virtual Font* GetFont();
virtual void SetFont(Font*, int span = 1);
private:
int _index;
BTree* _fonts;
};
const int NCHARCODES = 128;
class GlyphFactory {
public:
GlyphFactory();
virtual ~GlyphFactory();
virtual Character* CreateCharacter(char);
virtual Row* CreateRow();
virtual Column* CreateColumn();
// ...
private:
Character* _character[NCHARCODES];
};
11. USOS CONOCIDOS
El concepto de objetos del flyweight primero fue descrito y exploró como diseño técnica en las entrevistas 3.0 [CL90]. Sus reveladores construyeron un redactor de gran alcance del documento llamado doc. como prueba del concepto [CL92]. El doc. utiliza objetos del glyph para representar cada carácter en el documento. El redactor construye un caso del Glyph para cada carácter en un estilo particular (que defina sus cualidades gráficas); por lo tanto un character' el estado intrínseco de s consiste en el código de carácter y su información del estilo (un índice en una tabla del estilo) .4 que significa solamente la posición es extrínseca, haciendo el doc. rápido. Los documentos son representados por un documento de la clase, que también actúa como FlyweightFactory. Las medidas en el doc. han demostrado que la distribución de caracteres del flyweight es absolutamente eficaz. En un caso típico, un documento que contenía 180.000 caracteres requirió la asignación de solamente 480 objetos del carácter.
12. PATRONES ASOCIADOS
Se le relaciona al patrón composite frecuentemente con los patrones; composite, state, strategy, abstract factory.
REFERENCIAS BIBLIOGRÁFICAS
Design Patterns. Elements of Reusable Object-Oriented Software - Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides - Addison Wesley (GoF- Gang of Four)
Thinking in patterns in java – Bruce Eckel
Patterns in Java - Mark Grand – Wiley
No hay comentarios:
Publicar un comentario