Latest web development tutorials

Flyweight

Flyweight (Flyweight Pattern) est principalement utilisé pour réduire le nombre d'objets créés pour réduire l'utilisation de la mémoire et améliorer les performances. Ce type de modèles de conception fait partie d'modèle structurel, ce qui permet une réduction du nombre d'objets pour améliorer la structure de l'objet d'une manière requise par l'application.

Flyweight essayer de réutiliser les objets existants de même, si l'objet correspondant ne se trouve pas, un nouvel objet est créé. Nous allons tirer 20 cercles répartis dans différents endroits en créant cinq objets pour démontrer ce modèle. Depuis cinq sortes de couleurs disponibles, donc l'attribut de couleur est utilisé pour vérifier un objetCercleexistant.

introduction

Intention: Utiliser le partage pour soutenir un grand nombre d'objets à grains fins.

Principalement pour résoudre: Dans un grand nombre d'objets, il peut provoquer un dépassement de mémoire, nous mettons ensemble une partie dans laquelle l'abstrait, si vous avez la même demande directement vers des services d'objets existants dans la mémoire, pour éviter la ré-créé.

Quand l'utiliser: 1, le système dispose d' un grand nombre d'objets.2, ces objets consomment beaucoup de mémoire. 3, l'état de la plupart de ces objets peuvent être externalisées. 4, un grand nombre de ces objets peuvent être divisés en groupes en fonction de l'état intrinsèque, lorsque l'objet est retiré des objets extérieurs Yun, chaque objet peut être défini à l'aide d'un objet à la place. 5, le système ne dépend pas de l'identité de ces objets, ces objets sont impossibles à distinguer.

Comment corriger: Analyse avec un code d'identification unique, s'il y a dans la mémoire, le code d'identification unique des objets identifiés est retourné.

Le code clé: HashMap stocké avec ces objets.

Exemples d'application: 1, JAVA dans la chaîne, si elle retourne, sinon, créer une chaîne stockée dans le pool de mémoire tampon de chaîne à l' intérieur.2, la base de données de pool de données.

Avantages: réduire de manière significative la création d'objets, ce qui réduit la mémoire du système, de sorte que l' efficacité est améliorée.

Inconvénients: augmentation de la charge du système, nous avons besoin de séparer le statut d'état interne et externe, et de l' état externe de la nature intrinsèquement ne devrait pas changer avec l'état interne du changement, sinon il va créer un système de chaos.

Scénarios d' utilisation:1, le système dispose d' un grand nombre d'objets similaires. 2, ont besoin de mettre en commun scène.

Note: 1, prêter attention à l'état de la division interne et externe de l'état, ou il peut causer des problèmes de sécurité des threads.2, la classe doit avoir un objet usine pour être contrôlé.

réalisation

Nous allons créer une interfacede formeet de mise en œuvre de l'interfaceForme Cercledes classes d'entités. L'étape suivante consiste à définir des classes d'usineShapeFactory.

ShapeFactoryuncercledeHashMap,où la cléCerclede couleur nommé objet. Chaque fois qu'une demande est reçue, il va créer un cercle de couleur spécifique.ShapeFactoryvérifier leHashMapdans l'objet de cercle, si les objetsCircletrouvés, l'objet est retourné, sinon il va créer un stocké dans le hashmap pour se préparer à l' utilisation ultérieure du nouvel objet, et l'objet est retourné au client.

FlyWeightPatternDemo,notre démo pour obtenir la classe à utiliser objetShapeShapeFactory. Il transmet des informations(rouge / vert / bleu / noir/ blanc) àShapeFactory,il a besoin pour obtenir la couleur de l'objet.

motif Flyweight diagramme UML

Etape 1

Créer une interface.

Shape.java

public interface Shape {
   void draw ();
}

Etape 2

Créer classe d'entité qui implémente l'interface.

Circle.java

Cercle public class implémente Shape {
   couleur privée de chaîne;
   private int x;
   private int y;
   rayon int privé;

   Cercle publique (couleur String) {
      this.color = couleur;		
   }

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

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

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

   @Override
   tirage public void () {
      System.out.println ( "Circle: Draw () [Couleur:" + couleur 
         + ", X:" + x + ", y:" + y + ", rayon:" + rayon);
   }
}

Etape 3

Créer une usine pour produire les classes d'entité d'objet sur la base des informations données.

ShapeFactory.java

import java.util.HashMap;

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

   public static Forme getCircle (couleur String) {
      cercle Cercle = (Cercle) circleMap.get (couleur);

      if (cercle == null) {
         cercle = new Circle (couleur);
         circleMap.put (couleur, cercle);
         System.out.println ( "Création de cercle de couleur:" + couleur);
      }
      retour cercle;
   }
}

Etape 4

Utilisez l'usine pour obtenir un objet d'entité de la classe en passant les informations de couleur.

FlyweightPatternDemo.java

public class FlyweightPatternDemo {
   couleurs finales statiques privées String [] = de 
      { "Red", "vert", "bleu", "blanc", "Black"};
   main (String [] args) {public static void

      for (int i = 0; i <20; ++ i) {
         Cercle cercle = 
            (Cercle) ShapeFactory.getCircle (getRandomColor ());
         circle.setX (getRandomX ());
         circle.setY (getRandomY ());
         circle.setRadius (100);
         circle.draw ();
      }
   }
   Static String privé getRandomColor () {
      retour couleurs [(int) (Math.random () * colors.length)];
   }
   private static int getRandomX () {
      retour (int) (Math.random () * 100);
   }
   private static int getRandomY () {
      retour (int) (Math.random () * 100);
   }
}

Etape 5

Vérifiez la sortie.

cercle Création de la couleur: Noir
Circle: Draw () [Couleur: Noir, x: 36, y: 71, rayon: 100
cercle Création de couleur: vert
Circle: Draw () [Couleur: Vert, x: 27, y: 27, rayon: 100
Création cercle de couleur: Blanc
Circle: Draw () [Couleur: Blanc, x: 64, y: 10, rayon: 100
Création cercle de couleur: Rouge
Circle: Draw () [Couleur: Rouge, x: 15, y: 44, rayon: 100
Circle: Draw () [Couleur: Vert, x: 19, y: 10, rayon: 100
Circle: Draw () [Couleur: Vert, x: 94, y: 32, rayon: 100
Circle: Draw () [Couleur: Blanc, x: 69, y: 98, rayon: 100
Création cercle de couleur: Bleu
Circle: Draw () [Couleur: Bleu, x: 13, y: 4, rayon: 100
Circle: Draw () [Couleur: Vert, x: 21, y: 21, rayon: 100
Circle: Draw () [Couleur: Bleu, x: 55, y: 86, rayon: 100
Circle: Draw () [Couleur: Blanc, x: 90, y: 70, rayon: 100
Circle: Draw () [Couleur: Vert, x: 78, y: 3, rayon: 100
Circle: Draw () [Couleur: Vert, x: 64, y: 89, rayon: 100
Circle: Draw () [Couleur: Bleu, x: 3, y: 91, rayon: 100
Circle: Draw () [Couleur: Bleu, x: 62, y: 82, rayon: 100
Circle: Draw () [Couleur: Vert, x: 97, y: 61, rayon: 100
Circle: Draw () [Couleur: Vert, x: 86, y: 12, rayon: 100
Circle: Draw () [Couleur: Vert, x: 38, y: 93, rayon: 100
Circle: Draw () [Couleur: Rouge, x: 76, y: 82, rayon: 100
Circle: Draw () [Couleur: Bleu, x: 95, y: 82, rayon: 100