Latest web development tutorials

peso mosca

Peso mosca (flyweight) se utiliza principalmente para reducir el número de objetos creados para reducir el uso de memoria y mejorar el rendimiento. Este tipo de patrones de diseño pertenecen modelo estructural, que proporciona una reducción en el número de objetos para mejorar la estructura del objeto de una manera requerida por la aplicación.

Peso mosca intente volver a utilizar objetos existentes del mismo, si no se encuentra el objeto coincidente, se crea un nuevo objeto. Vamos a dibujar 20 círculos distribuidos en diferentes ubicaciones mediante la creación de cinco objetos para demostrar este patrón. Dado que sólo cinco clases de colores disponibles, por lo que el atributo de color se utiliza para comprobar un objetocírculoexistente.

introducción

Intención: Utilizar uso compartido para soportar un gran número de objetos de grano fino.

Principalmente para resolver: En un gran número de objetos, puede causar desbordamiento de la memoria, armamos una parte en la que el resumen, si usted tiene la misma solicitud de servicio directamente de nuevo los objetos existentes en la memoria, para evitar la re-creado.

Cuando usar: 1, el sistema tiene un gran número de objetos.2, estos objetos consumen mucha memoria. 3, el estado de la mayoría de estos objetos pueden ser objeto de exteriorización. 4, una gran cantidad de estos objetos se pueden dividir en grupos de acuerdo con el estado intrínseco, cuando el objeto se elimina de los objetos exteriores Yun, cada objeto se puede ajustar con un objeto en su lugar. 5, el sistema no depende de la identidad de estos objetos, estos objetos son indistinguibles.

Cómo solucionarlo: Analizando con un código de identificación único, si no está en la memoria, se devuelve el código de identificación única de los objetos identificados.

El código de la llave: HashMap almacenado con estos objetos.

Ejemplos de aplicación: 1, JAVA en cadena, si regresa, si no, entonces crear una cadena almacenada en la piscina búfer de cadena en el interior.2, la base de datos común de datos.

Ventajas: reducen significativamente la creación de objetos, la reducción de la memoria del sistema, por lo que se mejora la eficiencia.

Desventajas: incremento de la carga del sistema, tenemos que separar el estado de estado interno y externo, y el estado exterior de la naturaleza son inherentemente no debe cambiar con el estado interno de cambio, de lo contrario se creará sistema de caos.

Escenarios de uso: 1, el sistema tiene un gran número de objetos similares.2, tienen que reunir escena.

Nota: 1, prestar atención al estado de la división externa e interna del estado, o puede causar problemas de hilos de seguridad.2, la clase debe tener un objeto de fábrica para ser controlado.

realización

Vamos a crear una interfazde la formay la implementación de la interfaz deforma de círculoclases de entidad. El siguiente paso es definir clases de fábricaShapeFactory.

ShapeFactorytener uncírculodeHashMap,donde elcírculode color clave denominada objeto. Cada vez que se recibe una solicitud, se creará un círculo de color específico.ShapeFactorycomprobar suHashMapen el objeto círculo, si los objetosCírculoencuentra, se devuelve el objeto, de lo contrario se creará un almacenan en el mapa hash para prepararse para un uso posterior del nuevo objeto, y el objeto se devuelve al cliente.

FlyWeightPatternDemo,nuestra demostración para obtener la clase que se utiliza objetoShapeShapeFactory. Se transmitirá la información(rojo / verde / azul / negro/ blanco) aShapeFactory,que necesita para obtener el color del objeto.

flyweight diagrama UML

Paso 1

Crear una interfaz.

Shape.java

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

Paso 2

Crear clase de entidad que implementa la interfaz.

Circle.java

Círculo clase pública implementa la forma {
   String color privada;
   private int x;
   int y privada;
   int radio privada;

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

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

   pública setY void (int y) {
      this.y = y;
   }

   pública setRadius vacío (radio int) {
      this.radius = radio;
   }

   @ Override
   sorteo public void () {
      System.out.println ( "Círculo: Draw () [Color:" + Color 
         + ", X:" + x + ", y:" + y + ", el radio:" + radio);
   }
}

paso 3

Crear una fábrica para producir las clases de entidad de objetos en base a la información proporcionada.

ShapeFactory.java

java.util.HashMap importación;

ShapeFactory public class {
   HashMap private static final <String, Forma> circleMap = new HashMap ();

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

      si (círculo == null) {
         círculo = new Circle (color);
         circleMap.put (color, círculo);
         System.out.println ( "Creación de círculo de colores:" + color);
      }
      círculo de regreso;
   }
}

Paso 4

Utilice la fábrica para obtener un objeto entidad de la clase haciendo pasar la información de color.

FlyweightPatternDemo.java

public class {FlyweightPatternDemo
   Cuerda colores finales estáticas privadas [] = 
      { "Rojo", "verde", "azul", "blanco", "Negro"};
   principales argumentos (String []) {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 ();
      }
   }
   Cuerda estática privada getRandomColor () {
      volver colores [(int) (Math.random () * colors.length)];
   }
   private int getRandomX estática () {
      retorno (int) (Math.random () * 100);
   }
   private int getRandomY estática () {
      retorno (int) (Math.random () * 100);
   }
}

paso 5

Verifique la salida.

Creación de círculo de colores: Negro
Círculo: Draw () [Color: Negro, x: 36, y: 71, el radio: 100
Creación del círculo de color: verde
Círculo: Draw () [Color: verde, x: 27, y: 27, el radio: 100
Creación de círculo de color: blanco
Círculo: Draw () [Color: Blanco, x: 64, y: 10, el radio: 100
Creación del círculo de color: Rojo
Círculo: Draw () [Color: Rojo, x: 15, y: 44, el radio: 100
Círculo: Draw () [Color: verde, x: 19, y: 10, el radio: 100
Círculo: Draw () [Color: verde, x: 94, y: 32, el radio: 100
Círculo: Draw () [Color: Blanco, x: 69, y: 98, el radio: 100
Creación del círculo de color: azul
Círculo: Draw () [Color: azul, x: 13, y: 4, radio: 100
Círculo: Draw () [Color: verde, x: 21, y: 21, el radio: 100
Círculo: Draw () [Color: azul, x: 55, y: 86, el radio: 100
Círculo: Draw () [Color: Blanco, x: 90, y: 70, el radio: 100
Círculo: Draw () [Color: verde, x: 78, y: 3, el radio: 100
Círculo: Draw () [Color: verde, x: 64, y: 89, el radio: 100
Círculo: Draw () [Color: azul, x: 3, y: 91, el radio: 100
Círculo: Draw () [Color: azul, x: 62, y: 82, el radio: 100
Círculo: Draw () [Color: verde, x: 97, y: 61, el radio: 100
Círculo: Draw () [Color: verde, x: 86, y: 12, el radio: 100
Círculo: Draw () [Color: verde, x: 38, y: 93, el radio: 100
Círculo: Draw () [Color: Rojo, x: 76, y: 82, el radio: 100
Círculo: Draw () [Color: azul, x: 95, y: 82, el radio: 100