flyweight
Mão na massa: Flyweight
Problema:
No desenvolvimento de jogos são utilizadas várias imagens. Elas representam as entidades que compõe o jogo, por exemplo, cenários, jogadores, inimigos, entre outros. Ao criar classes que representam estas entidades, é necessário vincular a elas um conjunto de imagens, que representam as animações.
Quem desenvolve jogos pode ter pensado na duplicação de informação quando as imagens são criadas pelos objetos que representam estas entidades, por exemplo, a classe que representa um inimigo carrega suas imagens. Quando são exibidos vários inimigos do mesmo tipo na tela, o mesmo conjunto de imagens é criado repetidamente.
A solução para esta situação de duplicação de informações pelos objetos é a utilização do padrão Flyweight.
Flyweight
A intenção do padrão:
“Usar compartilhamento para suportar eficientemente grandes quantidades de objetos de granularidade fina.” [1]
Pela intenção percebemos que o padrão Flyweight cria uma estrutura de compartilhamento de objetos pequenos. Para o exemplo citado, o padrão será utilizado no compartilhamento de imagens entre as entidades.
Antes de exemplificar vamos entende um pouco sobre a estrutura do padrão. A classe Flyweight fornece uma interface com uma operação que deve ser realizado sobre um estado interno. No exemplo esta classe irá fornecer uma operação para desenhar a imagem em um determinado ponto. Desta forma a imagem é o estado intrínseco, que consiste de uma informação que não depende de um contexto externo. O ponto passado como parâmetro é o estado extrínseco, que varia de acordo com o contexto.
Vamos então ao código da imagem e do ponto:
1
2
3
4
5
6
7
8
9
10
11
public class Imagem { protected String nomeDaImagem; public Imagem(String imagem) { nomeDaImagem = imagem; } public void desenharImagem() { System.out.println(nomeDaImagem + " desenhada!"); }
}
Para simplificar o exemplo, será