Definição
O Flyweight pattern fornece um mecanismo pelo qual você pode evitar a criação de um grande número de objetos em vez da reutilização de objetos e instâncias existentes para representar novos objetos.
Quando usar
• Quando há um grande número de objetos que não podem caber na memória.
• Quando mais de um estado de objetos podem ser armazenados em disco ou calculados em tempo de execução.
Benefícios
Reduzir o número de objetos criados, diminuir consumo de memória e
aumentar o desempenho.
Desvantagens / consequências
Projetando objetos até os níveis mais baixos de "granularidade" que o sistema fornece proporciona uma ótima flexibilidade, mas pode ser inaceitavelmente caro em termos de desempenho e uso de memória.
Exemplo
Tentar usar objetos em níveis muito baixos de granularidade é bom, mas a
sobrecarga pode ser proibitiva.
public class Gazillion1 {
private static int num = 0;
private int row, col;
public Gazillion1( int maxPerRow ) {
row = num / maxPerRow;
col = num % maxPerRow;
num++;
}
void report() {
System.out.print( " " + row + col );
}
}
public class NoFlyweight {
public static final int ROWS = 6, COLS = 10;
public static void main( String[] args ) {
Gazillion1[][] matrix = new Gazillion1[ROWS][COLS];
for (int i=0; i < ROWS; i++)
for (int j=0; j < COLS; j++)
matrix[i][j] = new Gazillion1( COLS );
for (int i=0; i < ROWS; i++) {
for (int j=0; j < COLS; j++)
matrix[i][j].report();
System.out.println();
}
}
}
Quando o NoFlyweight é executado geramos um número excessivo de
objetos eo resultado é:
objetos eo resultado é:
00 01 02 03 04 05 06 07 08 09
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49
50 51 52 53 54 55 56 57 58 59
Introduzir Flyweight significa retirar o estado não-compartilhável da classe e fazer o cliente fornecê-lo quando necessário. Isto coloca mais responsabilidade sobre o cliente, mas, menos instâncias são criadas da classe Flyweight. O compartilhamento desses casos é facilitado pela introdução de uma classe Factory que mantém um conjunto de contrapesos existentes com estado reutilizáveis. No exemplo a seguir, a "linha" do estado é considerado
partilhável (dentro de cada linha de qualquer maneira), e do Estado "col" é externo (que é fornecida pelo cliente quando o relatório () é chamado).
partilhável (dentro de cada linha de qualquer maneira), e do Estado "col" é externo (que é fornecida pelo cliente quando o relatório () é chamado).
class Gazillion2 {
private int row;
public Gazillion2( int theRow ) {
row = theRow;
System.out.println( "Actual ctor: " + row );
}
void report( int theCol ) {
System.out.print( " " + row + theCol );
}
}
class FlyweightFactory {
private Gazillion2[] pool;
public FlyweightFactory( int maxRows ) {
pool = new Gazillion2[maxRows];
}
public Gazillion2 getFlyweight( int theRow ) {
if (pool[theRow] == null)
pool[theRow] = new Gazillion2( theRow );
return pool[theRow];
}
}
public class Flyweight {
public static final int ROWS = 6, COLS = 10;
public static void main( String[] args ) {
FlyweightFactory theFactory = new FlyweightFactory( ROWS );
for (int i=0; i < ROWS; i++) {
for (int j=0; j < COLS; j++)
theFactory.getFlyweight( i ).report( j );
System.out.println();
}
}
}
Quando Flyweight é executado geramos, a partir de uma perspectiva do cliente a mesma (Excessivo) quantidade de casos, mas, na realidade, apenas gerar uma instância por linha e reutilizar várias vezes essa instância. Isto é indicado na saída abaixo com o texto "exemplo real não x ":
Instância atual número 0
00 01 02 03 04 05 06 07 08 09
Instância atual número 1
10 11 12 13 14 15 16 17 18 19
Instância atual numero 2
20 21 22 23 24 25 26 27 28 29
Instância atual número 3
30 31 32 33 34 35 36 37 38 39
Instância atual número 4
40 41 42 43 44 45 46 47 48 49
Instância atual número 5
50 51 52 53 54 55 56 57 58 59
Exemplo de uso
O exemplo utilizado no livro do GoF original para o padrão flyweight são os
estruturas de dados para a representação gráfica de caracteres em uma palavra processador. Seria bom ter, para cada caractere em um documento, um objeto glifo contendo seu contorno de fonte, as métricas de fonte e outras formatações dados, mas equivaleria a centenas ou milhares de bytes para cada personagem. Em vez disso, para cada personagem pode haver uma referência a um objeto glifo flyweight compartilhado por todas as ocorrências da mesma natureza no documento, apenas a posição de cada personagem (no documento e / ou a página) teria de ser armazenado externamente. Outro exemplo típico de uso é uma das pastas. A pasta com o nome de cada um dos funcionários da empresa sobre isso, então, os atributos da classe Pasta
são: "escolhidos", "Não Selecionados" ea terceira é "employeeName". Com
esta metodologia, nós teremos que criar 2.000 casos para cada classe pasta
dos trabalhadores. Isso pode ser muito caro, então podemos criar apenas duas classes instâncias com atributos "selecionada" e "não selecionados" e definir o
nome do empregado por um método assim: setNameOnFolder (String nome);
Desta forma, as instâncias de classe pasta será compartilhada e você não terá que criar várias instâncias de cada funcionário.
Nenhum comentário:
Postar um comentário