Cet article décrit la mise en œuvre des fonctions de jeu d'échecs Gozi basées sur le mode Xiangyuan de Java. Partagez-le pour votre référence, comme suit:
1. Définition du modèle
Profitez du mode mondial soutient efficacement un grand nombre d'objets à grain fin d'une manière partagée. Réduisez la consommation de performances de la création d'instances d'objets de système en multiplexant les objets existants en mémoire. L'anglais de Xiangyuan est le poids mouche, ce qui signifie un objet particulièrement petit, c'est-à-dire un objet à grain fin.
2. Exemples du modèle
1. Analyse des modèles
Nous empruntons le jeu Gozi pour illustrer ce modèle.
2. Diagramme de classe statique de profit du mode yuan
3. Exemple de code
3.1 Création de Chessman abstrait
package com.demo.flyweight.object; classe abstraite de la classe abstraite AbstractChessman {// coordonnées de papier d'échecs protégées int x; protégé int y; // Catégorie d'échecs de papier d'échecs (noir | blanc) Échecs de chaîne protégés; public abstractChessman (String Chess) {this.chess = Chess; } // coordonnées ponctuelles définir le point de void abstract public (int x, int y); // affiche des informations de papier échoue public void show () {System.out.println (this.chess + "(" + this.x + "," + this.y + ")"); }}3.2 Création de Blackchessman
package com.demo.flyweight.object; classe publique Blackchessman étend AbstractCessman {/ ** * constructeur initialise Black Chessman * / public Blackchessman () {super ("●"); System.out.println ("- Blackchessman Construction Exec !!!"); } // Paramètre de coordonnées ponctuels @Override public void Point (int x, int y) {this.x = x; this.y = y; // montre les contenus d'échecs show (); }}3.3 Créer Whitechessman
package com.demo.flyweight.object; classe publique Whitechessman étend AbstractChessman {/ ** * constructeur initialise White Chessman * / public whitechessman () {super ("○"); System.out.println ("- Whitechessman Construction Exec !!!"); } // Paramètre de coordonnées ponctuels @Override public void Point (int x, int y) {this.x = x; this.y = y; // montre des contenus d'échecs show (); }}3.4 Créer une usine d'échecs
Package com.demo.flyweight.factory; import java.util.hashTable; import com.demo.flyweight.object.abstractchessman; import com.demo.flyweight.object.blackchessman; import com.demo.flyweight.object.whitechessman; classe publique fivechessmanfactory {// singleton impory private static static static static {// singleton PROCHEM FiveChessManfactory FiveChessManfactory = new FiveChesSManfactory (); // Cache pour stocker des objets partagés privés hashTable final <caractère, abstractchessman> cache = new hashTable <caractère, abstractchessman> (); // Constructeur de privatisation privé fivechessManfactory () {} // Obtenez Singleton Factory Public Static FiveChessManfactory getInstance () {return fiveChessManfactory; } / ** * Obtenez des pièces d'échecs basées sur les caractères * * @param C * (B: Black Chessw: White Chess) * @return * / public abstrChessman getchessmanObject (char C) {// Obtenez l'instance de l'objet PAWN du cache abstractChessman AbstractChessman = this.cache.get (c); if (abstractChessman == null) {// S'il n'y a pas d'informations sur l'instance d'objet Pawn dans le cache, créez l'instance d'objet Pawn et mettez-la dans le commutateur de cache (C) {case 'b': abstractChessman = new BlackChessman (); casser; cas «w»: abstractchessman = new whitechessman (); casser; par défaut: pause; } // pour empêcher les caractères illégaux d'entrer null if (abstractchessman! = Null) {// met this.cache.put (c, abstractchessman); }} // S'il y a un objet d'échecs dans le cache, retournez directement AbstractChessman; }}3.5 Implémentation du client
package com.demo; import java.util.random; import com.demo.flyweight.factory.fivechessmanfactory; import com.demo.flyweight.object.abstractchessman; / ** * application principale * * @Author * / public class Client {/ ** * @param arcs * / public static Void Main (String [] {// CREATE ARRESS * / PUBLIC STATIC VOID MAIN Factory FiveChessManfactory FiveChessManfactory = FiveChessManfactory .getInstance (); Aléatoire aléatoire = nouveau aléatoire (); int radom = 0; AbstractChessman AbstractChessman = NULL; // Obtenez la pièce d'échecs pour (int i = 0; i <10; i ++) {radom = random.nextint (2); Switch (radom) {// Obtenez le cas d'échecs noir 0: AbstractChessman = fiveChessManfactory.getChessManObject ('B'); casser; // Obtenez le cas d'échecs blanc 1: AbstractChessMan = fiveChsManfactory.getChessManObject ('W'); casser; } if (abstractChessman! = null) {abstractChessman.point (i, random.nextint (15)); }}}}4. Résultats de l'opération
- Whitechessman Construction Exec !!!
○ (0,2)
○ (1,6)
- Blackchessman Construction Exec !!!
● (2,3)
○ (3,14)
○ (4,13)
○ (5,8)
● (6,14)
● (7,0)
● (8,3)
○ (9,8)
3. Deux états du mode de plaisir
État intrinsèque : il ne changera pas avec le changement de l'environnement, il est stocké dans les informations d'état interne de l'objet entrinsic. Cet état intrinsèque peut être partagé. Pour tout objet d'entrée, sa valeur est exactement la même. Tout comme les "pièces noires" et les "pièces blanches" à Goji, l'état qu'il représente est l'état interne.
État externe : il changera avec le changement de l'environnement, il ne peut donc pas partager l'état. Pour différents objets du genre, ses valeurs peuvent être différentes. L'état externe de l'objet Xiangyuan doit être enregistré par le client. Une fois l'objet Xiangyuan créé et doit être utilisé, il sera transmis dans l'objet Xiangyuan. Tout comme les informations de position de Gozi, l'État représenté est l'état externe de l'objet de l'écologie.
Par conséquent, les états externes et internes de Xiangyuan sont deux états indépendants et n'ont aucun lien entre eux.
Iv. Principes de conception de ce modèle
1. Partagez des objets à grain fin pour réduire l'espace mémoire.
2. Isoler efficacement les pièces changeantes et les parties inchangées du système.
5. Utiliser des occasions
1. Lorsqu'il existe de nombreux cas d'un certain type d'objet dans le système.
2. Dans la conception du système, après avoir classé les instances d'objets, il est temps de constater qu'il existe peu de catégories distinctes.
6. Diagramme de classe statique de profit du mode yuan
Pour plus d'informations sur les algorithmes Java, les lecteurs qui sont intéressés par ce site peuvent afficher les sujets: "Structure de données Java et tutoriel d'algorithme", "Résumé des conseils de nœud de Dom Operation Java", "Résumé du fichier Java et des conseils d'opération de répertoire" et "Résumé des conseils d'opération Java Cache"
J'espère que cet article sera utile à la programmation Java de tous.