Latest web development tutorials

flyweight

Flyweight (FLYWEIGHT) é usado principalmente para reduzir o número de objetos criados para reduzir o uso de memória e melhorar o desempenho. Este tipo de padrões de design pertencem modelo estrutural, que proporciona uma redução no número de objectos para melhorar a estrutura do objecto de um modo requerido pela aplicação.

Flyweight tente reutilizar objetos existentes do mesmo, se o objeto correspondente não for encontrada, um novo objeto é criado. Vamos desenhar 20 círculos distribuídos em diferentes locais através da criação de cinco objetos para demonstrar esse padrão. Desde apenas cinco tipos de cores disponíveis, de modo que o atributo de cor é usada para verificar um objetocírculoexistente.

introdução

Intenção: Usar compartilhamento para suportar grandes quantidades de objetos de granulação fina.

Principalmente para resolver: Em um grande número de objetos, pode causar estouro de memória, montamos uma parte em que o resumo, se você tem o mesmo pedido de serviço diretamente de volta os objetos existentes na memória, para evitar re-criado.

Quando se deve utilizar: 1, o sistema tem um grande número de objectos.2, esses objetos consumir muita memória. 3, o estado da maioria destes objectos pode ser exteriorizada. 4, muitos desses objetos podem ser divididos em grupos de acordo com o estado intrínseco, quando o objeto é removido dos objetos Yun exteriores, cada objeto pode ser definido usando um objeto em seu lugar. 5, o sistema não depende da identidade desses objectos, estes objectos são indistinguíveis.

Como corrigir: Analisando com um código único de identificação, se existir em memória, o código único de identificação dos objectos identificados é devolvido.

A chave código: HashMap armazenado com esses objetos.

Exemplos de aplicação: 1, JAVA em String, se ele retorna, se não, em seguida, criar uma cadeia armazenada na área de buffer de cadeia no interior.2, o banco de dados conjunto de dados.

Vantagens: reduzir significativamente a criação de objectos, reduzindo a memória do sistema, de modo que a eficiência é melhorada.

Desvantagens: aumento na carga do sistema, temos de separar o status de estado interno e externo, e estado externo da natureza são inerentemente não deve mudar com o estado interno de mudança, caso contrário ele irá criar sistema de caos.

cenários de uso: 1, o sistema tem um grande número de objetos semelhantes.2, precisa de reunir cena.

Nota: 1, preste atenção ao estado da divisão interna e externa do Estado, ou pode causar problemas de thread-segurança.2, a classe deve ter um objecto de fábrica para ser controlado.

realização

Nós vamos criar uma interfaceFormae implementação da interfaceForma Círculoclasses de entidade. O próximo passo é definir classes de fábricaShapeFactory.

ShapeFactoryter umCírculodeHashMap,onde ocírculochave cor nomeada objeto. Sempre que um pedido é recebido, ele irá criar um círculo cor específica.ShapeFactoryverificar a suaHashMapno objeto círculo, se os objetosCírculoencontrado, o objeto é retornado, caso contrário ele irá criar um armazenado no hashmap para se preparar para posterior utilização do novo objeto, e o objeto é devolvido ao cliente.

FlyWeightPatternDemo,nossa demo para obter a classe a ser usada objetoShapeShapeFactory. Ele irá transmitir informações(vermelho / verde / azul / preto/ branco) paraShapeFactory,ele precisa obter a cor do objeto.

FLYWEIGHT UML diagrama

passo 1

Criar uma interface.

Shape.java

Forma interface pública {
   draw void ();
}

passo 2

Criar classe de entidade que implementa a interface.

Circle.java

classe pública Círculo implementa Forma {
   String cor privado;
   private int x;
   int y privado;
   raio int privado;

   Círculo pública (cor String) {
      this.color = cor;		
   }

   setX public void (int x) {
      this.x = x;
   }

   setY public void (int y) {
      this.y = y;
   }

   setRadius public void (raio int) {
      this.radius = raio;
   }

   @Override
   draw public void () {
      System.out.println ( "Circle: Draw () [Color:" + cor 
         + ", X:" + x + ", Y:" + y + ", raio:" + raio);
   }
}

passo 3

Criar uma fábrica para produzir as classes de entidade objeto com base na informação dada.

ShapeFactory.java

importação java.util.HashMap;

ShapeFactory classe pública {
   privada HashMap static final <String, Shape> circleMap = new HashMap ();

   pública getCircle Forma estática (cor String) {
      Círculo círculo = (Circle) circleMap.get (cor);

      if (círculo == null) {
         círculo = new Circle (cor);
         circleMap.put (cor, círculo);
         System.out.println ( "Criando círculo de cor:" + cor);
      }
      voltar círculo;
   }
}

passo 4

Use a fábrica para obter um objeto de entidade da classe, passando a informação de cor.

FlyweightPatternDemo.java

classe pública FlyweightPatternDemo {
   cores private static final String [] = 
      { "Vermelho", "Verde", "Blue", "branco", "Black"};
   main (String [] args) public static void {

      for (int i = 0; i <20; ++ i) {
         Círculo círculo = 
            (Círculo) ShapeFactory.getCircle (getRandomColor ());
         circle.setX (getRandomX ());
         circle.setY (getRandomY ());
         circle.setRadius (100);
         circle.draw ();
      }
   }
   Static String privada getRandomColor () {
      retornam cores [(int) (Math.random () * colors.length)];
   }
   privada getRandomX static int () {
      retorno (int) (Math.random () * 100);
   }
   privada getRandomY static int () {
      retorno (int) (Math.random () * 100);
   }
}

passo 5

Verifique saída.

Criando círculo de cor: preto
Circle: Draw () [Cor: Preto, x: 36, y: 71, radius: 100
Criando círculo de cor: verde
Circle: Draw () [Cor: Verde, x: 27, y: 27, radius: 100
Criando círculo de cor: Branco
Circle: Draw () [Cor: branco, x: 64, y: 10, radius: 100
Criando círculo de cor: vermelho
Circle: Draw () [Cor: Vermelho, x: 15, y: 44, radius: 100
Circle: Draw () [Cor: Verde, x: 19, y: 10, radius: 100
Circle: Draw () [Cor: Verde, x: 94, y: 32, radius: 100
Circle: Draw () [Cor: branco, x: 69, y: 98, radius: 100
Criando círculo de cores: azul
Circle: Draw () [Cor: Azul, x: 13, y: 4, raio: 100
Circle: Draw () [Cor: Verde, x: 21, y: 21, radius: 100
Circle: Draw () [Cor: Azul, x: 55, y: 86, radius: 100
Circle: Draw () [Cor: branco, x: 90, y: 70, radius: 100
Circle: Draw () [Cor: Verde, x: 78, y: 3, radius: 100
Circle: Draw () [Cor: Verde, x: 64, y: 89, radius: 100
Circle: Draw () [Cor: Azul, x: 3, y: 91, radius: 100
Circle: Draw () [Cor: Azul, x: 62, y: 82, radius: 100
Circle: Draw () [Cor: Verde, x: 97, y: 61, radius: 100
Circle: Draw () [Cor: Verde, x: 86, y: 12, radius: 100
Circle: Draw () [Cor: Verde, x: 38, y: 93, radius: 100
Circle: Draw () [Cor: Vermelho, x: 76, y: 82, radius: 100
Circle: Draw () [Cor: Azul, x: 95, y: 82, radius: 100