O O Flyweight é um padrão de projeto estrutural que permite que os programas suportem grandes quantidades de objetos, mantendo baixo o consumo de memória.
O padrão consegue isso compartilhando partes do estado do objeto entre vários objetos. Em outras palavras, o Flyweight economiza RAM armazenando em cache os mesmos dados usados por objetos diferentes.
Exemplos de uso: O padrão Flyweight tem uma única finalidade: minimizar a utilização de memória. Se o seu programa não apresentar problemas de falta de RAM, você poderá ignorar esse padrão por um tempo.
Exemplos de Flyweight nas principais bibliotecas Java:
Identificação: O Flyweight pode ser reconhecido por um método de criação que retorna objetos em cache em vez de criar novos.
Renderizando uma floresta
Neste exemplo, vamos renderizar uma floresta (1.000.000 árvores)! Cada árvore será representada por seu próprio objeto que possui algum estado (coordenadas, textura e assim por diante). Embora o programa faça seu trabalho principal, naturalmente consome muita RAM.
O motivo é simples: muitos objetos árvore contêm dados duplicados (nome, textura, cor). É por isso que podemos aplicar o padrão Flyweight e armazenar esses valores em objetos separados de flyweight (a classe TreeType). Agora, em vez de armazenar os mesmos dados em milhares de objetos Tree, vamos fazer referência a um dos objetos flyweight com um conjunto específico de valores.
O código cliente não notará nada, pois a complexidade da reutilização de objetos flyweight está enterrada dentro de uma fábrica de flyweight.
trees
trees/Tree.java: Contém estado único para cada árvore
trees/TreeType.java: Contém estado compartilhado por diversas árvores
trees/TreeFactory.java: Encapsula a complexidade da criaçã flyweight das árvores