Projeto de Sistemas de Software Flyweight Projeto de Sistemas de Software Roberta Claudino Barreto Pessanha Gomes Ugo Braga Sangiorgi
Flyweight Propósito Usar compartilhamento para suportar uma grande quantidade de objetos de baixa granularidade de forma eficiente © LES/PUC-Rio
Flyweight Motivação Abstrair até o último nível é custoso Um Flyweight é um objeto compartilhado que pode ser usado em vários contextos ao mesmo tempo possui um estado intrínseco (comum a todos os contextos) se utiliza de vários estados extrínsecos (particulares a cada contexto) Ex.: Editor de Texto © LES/PUC-Rio
Flyweight Aplicabilidade A aplicação usa muito objetos A aplicação não depende da identidade de cada objeto individualmente Custo de armazenar os objetos é alto O estado de cada objeto pode ser armazenado fora dele Grupos de objetos podem ser substituídos por alguns objetos compartilhados © LES/PUC-Rio
Flyweight Estrutura © LES/PUC-Rio
Flyweight - Participantes Declara a interface pela qual os flyweights recebem e agem no estado extrínsico ConcreteFlyweight É compartilhado UnsharedConcreteFlyweight NÃO é compartilhado, é comum conter ConcreteFlyweights FlyweightFactory Compartilha os Flyweights quando já existem e cria quando ainda não existem Client Mantém referências para os Flyweights Armazena o estado extrínsico © LES/PUC-Rio
Flyweight Colaborações Consequências Clientes devem obter Flyweights exclusivamente da Factory Estado intrínseco é armazenado no ConcreteFlyweight Estado extrínseco é computado ou armazenado pelo Cliente. Clientes passam o estado ao flyweight. Consequências Custos de run-time associados com transferência, busca e/ou computação do estado extrínseco compensados pela economia em uso de memória à medida que mais flyweights são criados Redução de consumo de memória Redução do total de instâncias resultantes do compartilhamento Quantidade de estado intrínseco por objeto Se o estado extrínseco é armazenado ou computado © LES/PUC-Rio
Flyweight - Participantes Implementação Flyweight public interface Flyweight { public void Operation(int extrinsicstate); } ConcreteFlyweight public class ConcreteFlyweight implements Flyweight{ public void Operation(int extrinsicstate) { System.out.println("ConcreteFlyweight :" + extrinsicstate); UnsharedConcreteFlyweight public class UnsharedConcreteFlyweight implements Flyweight{ System.out.println("UnsharedConcreteFlyweight: " + extrinsicstate); © LES/PUC-Rio
Flyweight - Participantes Implementação FlyweightFactory import java.util.ArrayList; public class FlyweightFactory { ArrayList flyweights = new ArrayList(); public Flyweight GetFlyweight(int key) { if (flyweights.contains(key)){ return ((Flyweight) flyweights.get(key)); }else { Flyweight fly = new ConcreteFlyweight(); flyweights.add(key, fly); return fly; } © LES/PUC-Rio
Flyweight - Participantes Implementação Client public class Client { public static void main(String[] args) { int extrinsicstate = 12; // Estado extrínseco FlyweightFactory f = new FlyweightFactory(); Flyweight f0 = f.GetFlyweight(0); f0.Operation(--extrinsicstate); Flyweight f1 = f.GetFlyweight(1); f1.Operation(--extrinsicstate); Flyweight f2 = f.GetFlyweight(2); f2.Operation(--extrinsicstate); Flyweight f3 = f.GetFlyweight(3); f3.Operation(--extrinsicstate); UnsharedConcreteFlyweight uf = new UnsharedConcreteFlyweight(); uf.Operation(--extrinsicstate); } © LES/PUC-Rio