Este artículo describe la implementación de las funciones del juego de ajedrez de Gozi basadas en el modo Xiangyuan de Java. Compártelo para su referencia, como sigue:
1. Definición de patrones
Disfrute del modo mundial admite eficientemente una gran cantidad de objetos de grano fino de una manera compartida. Reduzca el consumo de rendimiento de la creación del sistema de la creación de instancias de objetos multiplexando los objetos existentes en la memoria. El inglés de Xiangyuan es de peso mosca, lo que significa un objeto particularmente pequeño, es decir, un objeto de grano fino.
2. Ejemplos del modelo
1. Análisis de patrones
Tomamos prestado el juego de Gozi para ilustrar este patrón.
2. Diagrama de clase estática del modo de disfrutar yuan
3. Ejemplo de código
3.1 Creación de Chessman Abstract
paquete com.demo.flyweight.object; public abstract class abstractChessman {// coordenadas de ajedrez protegidas int x; protegido int y; // Categoría de capricho (negro | blanco) ajedrez de cadena protegida; public AbstractChessman (String Chess) {this.chess = Ajedre; } // Las coordenadas de punto establecen un punto vacío público abstracto (int x, int y); // show de ajedrez información public void show () {system.out.println (this.chess + "(" + this.x + "," + this.y + ")"); }}3.2 Creación de Blackchessman
paquete com.demo.flyweight.object; public class Blackchessman extiende AbstractChessman { / ** * Constructor inicializa Black Chessman * / public Blackchessman () {super ("●"); System.out.println ("-Blackchessman Construction Exec!"); } // Configuración de coordenadas de punto @Override public void Point (int x, int y) {this.x = x; this.y = y; // show de contenido de ajedrez show (); }}3.3 Crear Whitechessman
paquete com.demo.flyweight.object; public class Whitechessman extiende AbstractChessman { / ** * El constructor inicializa White Chessman * / public Whitechessman () {super ("○"); System.out.println ("-Whitechessman Construction Exec!"); } // Configuración de coordenadas de punto @Override public void Point (int x, int y) {this.x = x; this.y = y; // show de contenido de la pieza de ajedrez show (); }}3.4 Crear una fábrica de ajedrez
paquete com.demo.flyweight.factory; import java.util.hashtable; import com.demo.flyweight.object.abstractChessman; import com.demo.flyweight.object.blackchessman; import.demo.flyweight.object.whiteChessman; public fiveChessManManman {// singleton fetory fechin fivechessManFactory = new FivechessManFactory (); // Cache para almacenar objetos compartidos hashtables finales privados <carácter, abstractChessman> cache = new Hashtable <caracteres, abstractChessman> (); // Constructor de privatización privado FivechessManFactory () {} // Get Singleton Factory public static fivechessManFactory getInstance () {return fivechessManFactory; } / ** * Obtenga piezas de ajedrez basadas en caracteres * * @param c * (B: Black Chessw: White Chess) * @return * / public abstractChessman getChessManObject (char c) {// Obtenga la instancia del objeto de peón del Cache AbstractChessman AbstractChessman = this.cache.get (c); if (abstractChessman == null) {// Si no hay información de instancia de objeto de peón en el caché, cree la instancia de objeto de empeño y colóquela en el interruptor de caché (c) {case 'b': abstractChessman = new BlackChessman (); romper; caso 'W': AbstractChessman = new Whitechessman (); romper; predeterminado: ruptura; } // para evitar que los caracteres ilegales ingresen nulo if (abstractChessman! = Null) {// pon esto.cache.put (c, abstractChessman); }} // Si hay un objeto de ajedrez en el caché, devuelve directamente abstractChessman; }}3.5 Implementación del cliente
paquete com.demo; import java.util.random; import com.demo.flyweight.factory.fiveCessManTory; import com.demo.flyweight.object.abstractChessman;/** * Aplicación principal * * @author */public class Cliente {/** * @param args */public static void void (String [] FIVechessManFactory FivechessManFactory = FIVechessManFactory .getInStance (); Aleatorio aleatorio = new Random (); int radom = 0; AbstractChessman AbstractChessman = NULL; // Obtenga la pieza de ajedrez para (int i = 0; i <10; i ++) {radom = random.nextint (2); Switch (Radom) {// Obtenga el caso de ajedrez negro 0: AbstractChessman = FivechessManFactory.getChessManObject ('B'); romper; // Obtener el Caso de ajedrez blanco 1: AbstractChessman = FivechessManFactory.getChessManObject ('W'); romper; } if (abstractChessman! = NULL) {AbstractChessman.Point (i, Random.NextInt (15)); }}}}4. Resultados de la operación
-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. Dos estados del modo de disfrute
Estado intrínseco : no cambiará con el cambio del entorno, se almacena en la información de estado interno del objeto de entrada. Este estado intrínseco se puede compartir. Para cualquier objeto de entrada, su valor es exactamente el mismo. Al igual que las "piezas negras" y "piezas blancas" en Goji, el estado que representa es el estado interno.
Estado externo : cambiará con el cambio del entorno, por lo que no puede compartir el estado. Para diferentes objetos del género, sus valores pueden ser diferentes. El cliente debe guardar el estado externo del objeto Xiangyuan. Después de que se cree el objeto Xiangyuan y debe usarse, se pasará al objeto Xiangyuan. Al igual que la información de posición de Gozi, el estado representado es el estado externo del objeto de la ecología.
Por lo tanto, los estados externos e internos de Xiangyuan son dos estados independientes y no tienen conexión entre sí.
IV. Principios de diseño de este modelo
1. Comparta objetos de grano fino para reducir el espacio de memoria.
2. Aislar efectivamente las partes cambiantes y las partes sin cambios del sistema.
5. Use ocasiones
1. Cuando hay muchas instancias de cierto tipo de objeto en el sistema.
2. En el diseño del sistema, después de clasificar las instancias de objetos, es hora de descubrir que hay pocas categorías reales distintas.
6. Diagrama de clase estática del modo disfrutar yuan
Para obtener más información sobre los algoritmos de Java, los lectores interesados en este sitio pueden ver los temas: "Estructura de datos Java y tutorial de algoritmo", "Resumen de las puntas de nodo de operación de Java DOM", "Resumen de Java Archivo y TIPS de operación de directorio" y "Summary of Java Cache Operation Tips" TIPS ""
Espero que este artículo sea útil para la programación Java de todos.