Design Patterns Projeto de Sistemas de Software Kelly Leal Leandra Mara da Silva Motivação • Aprimorar conhecimentos sobre Projeto de Sistemas de Software, realizando um estudo incremental dos Padrões de Projeto apresentados em [GoF]. © LES/PUC-Rio Padrão Flyweight Flyweight • Classificação – Estrutural de Objeto • Propósito – Usar compartilhamento para suportar eficientemente grandes quantidades de objetos de granularidade fina. © LES/PUC-Rio Flyweight • Motivação – Aplicações que utilizam grande número de objetos • Exemplo de Problema: desenvolver um editor de texto onde cada caracter é representado por um objeto. Pode não haver recursos (memória) sufientes para textos muito grandes. p u b /* Trabalho de PSS*/ l Objeto Linha i public static ... c System.out.println ... © LES/PUC-Rio Objeto Linha Flyweight • Motivação – Aplicações que utilizam grande número de objetos • Exemplo de solução: monta-se um pool de objetos compartilhados. Cada caracter tem um objeto. Com 100 objetos (tabela ASCII) poderíamos montar textos de qualquer tamanho System.out.println (“Poj. de Sistemas de Software”) a b c d e f g ... Pool de Flyweight © LES/PUC-Rio Flyweight Observações: – O padrão procura fatorar as informações comuns a diversos objetos. – Desassocia o que é intrínseco do que é extrínseco ao objeto • Intrínseco: inerente, próprio do objeto. Informações independentes de contexto, podendo, por isso, ser compartilhadas. Essas informações são armazenadas no flyweight. • Extrínseco: depende e varia com o contexto, não podendo, por isso, ser compartilhado. Tal estado é armazenado no cliente. © LES/PUC-Rio Flyweight • Aplicabilidade – Aplicação utiliza grande número de objetos – Custos de armazenamento altos – A maior parte dos estados de objetos pode ser tornada extrínseca (estados externalizados) – Muitos objetos podem ser substituídos por poucos objetos compartilhados – Aplicação não depende da identidade dos objetos. obs: testes de identidade produzirão o valor verdadeiro para objetos conceitualmente distintos. © LES/PUC-Rio Flyweight © LES/PUC-Rio Flyweight • Participantes – Flyweight • Define a interface através da qual os objetos flyweight recebem e agem em relação ao estado extrínseco – ConcreteFlyweight • Implementa a interface flyweight e adiciona as características intrínsecas, se houver – UnsharedConcreteFlyweight • Nem todas as subclasses flyweight precisam ser compartilhadas • A interface flyweight permite o compartilhamento, mas não obriga a utilizá-lo – FlyweightFactory • Cria e gerencia os objetos flyweight • Garante que o compartilhamento está correto – Client • Mantém uma referência ao flyweight • Armazena o estado extrínseco do flyweight © LES/PUC-Rio Flyweight • Colaborações – O estado intrínseco é armazenado no objeto ConcreteFlyweight – O estado extrínseco é armazenado no objeto Client, que passam ao flyweight quando chamam suas operações – Os clientes não instanciam o ConcreteFlyweight diretamente • Conseqüências – Pode aumentar o processamento – Redução do número de instâncias de classes – Utilizado com o auxílio do padrão Composite para permitir a representação de grafos © LES/PUC-Rio Flyweight © LES/PUC-Rio Flyweight © LES/PUC-Rio Fim!!