miércoles, 29 de abril de 2015

Flyweight

FLYWEIGHT

Propósito

Compartir estados para soportar un gran número de objetos pequeños aumentando la eficiencia en espacio.


Motivación

Describe cómo 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.


Aplicabilidad

Cuando se cumplan las siguientes 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 mayor parte del estado del objeto puede ser extrínseco.

Estructura


Participantes

Flyweight: Declaran una interface a través de la que flyweights pueden recibir y actuar sobre 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, calculando o almacenando los estados no compartidos de los flyweights.

Colaboraciones

Los clientes no crean directamente los objetos Flyweight, sino que debeninvocar las fábricas. El estado extrínseco es mantenido por el cliente ypasado cuando se invocan métodos que lo requieren.

Consecuencias

Ventajas

Produce ahorro de la capacidad almacenamiento
Reduce el número total de objetos
Reduce en gran cantidad el peso de los datos en un servidor.

Desventajas:

Consume un poco mas de tiempo para realizar las busquedas.

Implementación

Considere los siguientes aspectos cuando implemente el patrón de diseño flyweight: 

  • Eliminar estados extrínsecos. El patrón depende ampliamente de identificar es-tados extrínsecos y removerlos de los objetos compartidos. Los estados extrín-secos, por su parte deben ser calcula-dos, en alguna parte donde los requeri-mientos de memoria sean bajos. 
  • Debido a que los flyweight son comparti-dos, no deberían ser instanciados direc-tamente por los clientes. La clase Fly-weightFactory deja a los clientes localizar un flyweight en particular. 
Código de ejemplo

El código ejemplo pinta 5 pelotas en la pantalla, pero solo utiliza un objeto que sirve de referencia a las 5 pelotas.

//Interfa Flyweight

import java.awt.Image;

public interface Pelota {

public Image getPelota();

}

//ConcreteFlyweight implementa la inerfaz y guarda estados intrínsecos

import java.awt.Image;

import java.awt.image.BufferedImage;

import java.io.IOException;

import javax.imageio.ImageIO;

public class PelotaConcreta implements Pelota {


private BufferedImage imagen;

public PelotaConcreta() {

try{

imagen= ImageIO.read(getClass().getClassLoader().getResource("pelota.gif"));

}catch(IOException e){

System.out.println("no se puede cargra la imagen");

}

}

public Image getPelota(){

System.out.println("aqui");

return (Image)imagen;

}

}

//(FlyweightFactory) garantiza que los objetos se inicialicen correctamente.

//Fijese que esta clase es un singleton.

public class PelotaFactory {


private static Pelota miPelota =null;

public static Pelota getPelota(){

if(miPelota==null)miPelota=new PelotaConcreta();

return miPelota;

}

}

//(Client) Mantiene una referencia a pelota

//almacen estados esxtrínsecos.

import java.awt.Image;


public class DibujaPelota {

private Pelota pelota = PelotaFactory.getPelota();

//Estados extrínsicos que son mantenidos por el cliente

private int cordX=0;

private int cordY=0;


public Image getPelota(){

return pelota.getPelota();

}

public void setCordX(int x){

cordX=x;

}

public void setCordY(int y){

cordY=y;

}

public int getCordX(){

return cordX;

}

public int getCordY(){

return cordY;

}

}

//clase que se encarga d la presentacion

import javax.swing.JPanel;

import javax.swing.JButton;

import javax.swing.JFrame;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.Image;

import java.awt.Graphics;

import java.util.Random;


public class Presentacion extends JFrame implementsActionListener{

private final int DIMENSION_IMAGEN =40;

private JPanel panel;

private JButton mover;

private Image imagen=null;

private DibujaPelota pelotas[]={newDibujaPelota(),new DibujaPelota(),newDibujaPelota(),new DibujaPelota(),new DibujaPelota()};

private DibujaPelota pelota=pelotas[0];

private int x=0;

private int y=0;

private Random aleatorio= new Random(1000L);


public Presentacion(){

panel = new JPanel();

mover=new JButton("Mover");

this.setTitle("Pelotas");

this.setSize(350,400);

this.setResizable(false);

this.setVisible(true);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

panel=(JPanel)this.getContentPane();

panel.setLayout(null);

panel.add(mover);

mover.setBounds(20, 20, 70, 20);

mover.addActionListener(this);

//aleatorio.setSeed(1000);

}

public static void main(String args[]){

new Presentacion();

}

public void paint(Graphics g){

g.fill3DRect(100, 100, 20, 20, true);

g.clearRect(x,y+100,DIMENSION_IMAGEN,DIMENSION_IMAGEN);

imagen=pelota.getPelota();

g.drawImage(imagen,pelota.getCordX(),pelota.getCordY(),DIMENSION_IMAGEN,DIMENSION_IMAGEN,this);

}

public void actionPerformed(ActionEvent e) {

for(int i=0; i<5;>

x=pelotas[i].getCordX();

y=pelotas[i].getCordY();

pelotas[i].setCordX((int)aleatorio.nextLong()*240);

pelotas[i].setCordY((int)aleatorio.nextLong()*340);

pelota=pelotas[i];

}

repaint();

}
}


Usos conocidos

ET + + [WGM88] utiliza para apoyar flyweights look-and-feel , norma afecta a la disposición de elementos de interfaz de usuario (por ejemplo, desplazarse barras, botones, menús, conocidas colectivamente como "widgets") y su decoración (por ejemplo, sombras, biselado). Un widget todos los delegados de su configuración y el comportamiento de dibujo Diseño de un objeto. Cambiar el diseño de objetos cambia el aspecto y, incluso en tiempo de ejecución.


Patrones relacionados

Es a menudo combinado con el patrón composite al aplicar una estructura jerárquica, lógicamente, en términos de un gráfico acíclico dirigido - compartida con la hoja de nodos. A menudo es mejor para la aplicación de state y strategy como objetos flyweights . 


Referencias

  • PDF-Departamento de Sistemas Informáticos y Programación Curso de doctorado 1999 - 2000 Patrones de diseño orientado a objetos.
  • DesIgn Patterns: Elements of Reusable Object-Oriented Software Gamma, Helm, Johnson, Vlissides Editorial Addison-Wesley.
  • www.ldc.usb.ve/~mgoncalves/IS2/sd07/grupo5.ppt 
 


No hay comentarios:

Publicar un comentario