250 likes | 600 Views
Sistemas de Información:. Patrón de diseño FlyWeight. Eduardo Perdices García Jafet Villafranca Díaz Santiago Pascual Saiz. Índice . Tipo Propósito Motivación Aplicabilidad Diagrama de clases Participantes Colaboraciones Código ejemplo Patrones relacionados Bibliografía. Tipo.
E N D
Sistemas de Información: Patrón de diseño FlyWeight Eduardo Perdices García Jafet Villafranca Díaz Santiago Pascual Saiz Sistemas de Información, 2007.
Índice • Tipo • Propósito • Motivación • Aplicabilidad • Diagrama de clases • Participantes • Colaboraciones • Código ejemplo • Patrones relacionados • Bibliografía Sistemas de Información, 2007.
Tipo Patrón estructural, determina como combinar objetos y clases para definir estructuras complejas. Sistemas de Información, 2007.
Propósito Compartir estados para soportar un gran número de objetos pequeños aumentando la eficiencia en espacio. Sistemas de Información, 2007.
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. Sistemas de Información, 2007.
Aplicabilidad Se debe aplicar este patrón cuando se cumplen todas estas características: • Se utiliza un gran número de objetos • El coste de almacenamiento es alto debido a la cantidad de objetos • La mayoría de los estados de los objetos pueden ser creados como comunes. • Muchos objetos pueden ser reemplazados por unos pocos una vez que han sido borrados los estados no comunes. • La aplicación no depende de la identidad de los objetos. Sistemas de Información, 2007.
Ejemplo alto nivel Estamos almacenando un texto con un determinado formato en el que cada carácter es un objeto representado por la letra en sí, el tamaño y la fuente. Si ponemos el mismo formato a un párrafo entero, el tamaño y la fuente de cada carácter se repetiría cada vez y es un desperdicio de memoria innecesario. Para ello utilizamos una nueva clase que almacene el tamaño y la fuente y hacemos que la clase anterior solo se componga de un atributo con la letra y otro atributo que referencie a la clase que acabamos de crear. Sistemas de Información, 2007.
Diagrama de Clases Sistemas de Información, 2007.
Participantes • Flyweight • ConcreteFlyweight • UnsharedConcreteFlyweight • FlyweightFactory • Client Sistemas de Información, 2007.
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. Sistemas de Información, 2007.
Participantes • 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. Sistemas de Información, 2007.
Participantes • Client Contiene referencias a los flyweights. Calcula o almacena los estados no compartidos de los flyweights. Sistemas de Información, 2007.
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. Sistemas de Información, 2007.
Código Ejemplo • CreaLetra.java public abstract class CreaLetra { public abstract void asignaLetra(Letra letra); } • Letra.java public class Letra { private char letra; public Letra(char letra) { this.setLetra(letra); } public char getLetra() { return this.letra; } private void setLetra(char letra) { this.letra=letra; } } Sistemas de Información, 2007.
Código Ejemplo • Formato.java public class Formato extends CreaLetra{ private String tipo; private int tam; public Formato(String tipo,int tam) { this.setTipo(tipo); this.setTam(tam); } //gets y sets... public void asignaLetra(Letra letra) { System.out.println( "Tipo de letra " + this.getTipo() + " con tamaño: " + this.getTam() + " para la letra " + letra.getLetra()); } public boolean equals(Object obj) { return this.getTipo().equals(((Formato)obj).getTipo()) & this.getTam()==((Formato)obj).getTam(); } } Sistemas de Información, 2007.
Código Ejemplo • FormatoFactory.java public class FormatoFactory { private CreaLetra[] formatos; private int creados; public FormatoFactory() { this.formatos=new Formato[100]; this.setCreados(0); } public int getCreados() { return this.creados; } private void setCreados(int creados) { this.creados=creados; } Sistemas de Información, 2007.
Código Ejemplo • FormatoFactory.java public CreaLetra getFormato(String tipo, int tam) { CreaLetra tmp = new Formato(tipo,tam); if (this.getCreados() > 0) { for (int i = 0; i < getCreados(); i++) { if (tmp.equals(formatos[i])) { return formatos[i]; } } } formatos[this.getCreados()] = tmp; this.setCreados(this.getCreados()+1); return formatos[this.getCreados()-1]; } } Sistemas de Información, 2007.
Código Ejemplo • TestFlyweight.java class TestFlyweight { private CreaLetra[] formatos; private Letra[] letras; private FormatoFactory formatoFactory; private int numLetras; public TestFlyweight() { this.formatos = new Formato[100]; this.letras = new Letra[100]; this.formatoFactory = new FormatoFactory(); this.setNumLetras(0); } //gets y sets... public void recibirLetra(String tipo, int tam, char letra){ formatos[this.getNumLetras()] = formatoFactory.getFormato(tipo,tam); letras[this.getNumLetras()] = new Letra(letra); this.setNumLetras(this.getNumLetras()+1); } } Sistemas de Información, 2007.
Código Ejemplo • TestFlyweight.java public void runTest() { this.recibirLetra("Arial",10,'a'); this.recibirLetra("Arial",10,'b'); this.recibirLetra("Times",11,'c'); this.recibirLetra("Times",11,'d'); this.recibirLetra("Comic",11,'e'); this.recibirLetra("Comic",11,'f'); this.recibirLetra("Arial",10,'g'); this.recibirLetra("Arial",10,'h'); this.recibirLetra("Times",10,'i'); this.recibirLetra("Times",10,'j'); this.recibirLetra("Arial",11,'k'); this.recibirLetra("Arial",11,'l'); } Sistemas de Información, 2007.
Código Ejemplo • TestFlyweight.java for (int i = 0; i < this.getNumLetras(); i++){ formatos[i].asignaLetra(letras[i]); } System.out.println(""); System.out.println("Número total de formatos creados: " + formatoFactory.getCreados()); } public static void main(String[] args) { TestFlyweight test = new TestFlyweight(); test.runTest(); } } Sistemas de Información, 2007.
Código Ejemplo • Salida del programa Tipo de letra Arial con tamaño: 10 para la letra a Tipo de letra Arial con tamaño: 10 para la letra b Tipo de letra Times con tamaño: 11 para la letra c Tipo de letra Times con tamaño: 11 para la letra d Tipo de letra Comic con tamaño: 11 para la letra e Tipo de letra Comic con tamaño: 11 para la letra f Tipo de letra Arial con tamaño: 10 para la letra g Tipo de letra Arial con tamaño: 10 para la letra h Tipo de letra Times con tamaño: 10 para la letra i Tipo de letra Times con tamaño: 10 para la letra j Tipo de letra Arial con tamaño: 11 para la letra k Tipo de letra Arial con tamaño: 11 para la letra l Número total de formatos creados: 5 Sistemas de Información, 2007.
Patrones relacionados • Composite, utilizado para componer objetos en estructural de árbol para representar jerarquías. • Proxy, que proporciona un intermediario de otro objeto para controlar el acceso a este. • Facade, que proporciona una interfaz unificada para un conjunto de interfaces de un subsistema. Sistemas de Información, 2007.
Bibliografía • Página Web Wikipedia: http://es.wikipedia.org/wiki/Flyweight_(patr%C3%B3n_de_dise%C3%B1o) • Página Web All App Labs:http://www.allapplabs.com/java_design_patterns/flyweight_pattern.htm • Página Web Fluffy Cat: http://www.fluffycat.com/Java-Design-Patterns/Flyweight/ Sistemas de Información, 2007.
Sistemas de Información: Patrón de diseño FlyWeight Eduardo Perdices García Jafet Villafranca Díaz Santiago Pascual Saiz Sistemas de Información, 2007.