En el libro del Dr. Yan Hong "Java and Mode", comienza con la descripción del modo de peso mosca:
El peso mosca se refiere al nivel de peso más ligero, es decir, "peso mosca" o "nivel de lluvia". La traducción del "modo Xienyuan" se elige aquí porque esto puede reflejar mejor la intención del modo. El patrón de la enciclopedia es el patrón estructural de un objeto. El modo Enciclopedia admite eficientemente una gran cantidad de objetos de grano fino de manera compartida.
Tipo de cadena en Java
En el idioma Java, el tipo de cadena usa el modo Enciclopedia. El objeto de cadena es de tipo final y no se puede cambiar una vez que se crea. En Java, las constantes de cadena están presentes en la piscina constante. Java se asegurará de que una constante de cadena solo tenga una copia en el grupo constante. Cadena a = "ABC", donde "ABC" es una constante de cadena.
prueba de clase pública {public static void main (string [] args) {String a = "ABC"; Cadena B = "ABC"; System.out.println (a == b); }}El resultado en el ejemplo anterior es verdadero, lo que significa que tanto A como B se refieren al mismo "ABC" constante de cadena en el grupo constante. Tal diseño evita grandes cantidades innecesarias de consumo de recursos generado al crear N o más objetos idénticos.
La estructura del modelo de disfrute
El modelo de disfrute adopta un intercambio para evitar la sobrecarga de tener el mismo objeto de contenido. Lo más común e intuitivo de esta sobrecarga es la pérdida de memoria. La clave para compartir el objeto Enciclopedia es distinguir entre el estado interno y el estado externo .
Un estado intrínseco se almacena dentro del objeto Xiangyuan y no variará con el medio ambiente. Por lo tanto, un elemento de sacrificio puede tener un estado intrínseco y puede compartirse.
Un estado externo cambia con el cambio del entorno y no se puede compartir. El estado del estado de Xiangyuan debe ser guardado por el cliente, y después de que se crea el objeto Xiangyuan, se pasa al objeto Xiangyuan cuando necesita ser utilizado. Los estados externos no pueden afectar el estado interno del objeto vivo, son independientes entre sí.
El modo de disfrutar de yuan se puede dividir en dos formas: el modo de disfrutar yuan y el modo compuesto disfrutar de yuan.
Modo de disfrute simple
En el modo existente simple, se pueden compartir todos los objetos existentes.
Los roles involucrados en el modo de disfrute simple son los siguientes:
Rol de peso mosca abstracta: ofrece una interfaz abstracta para especificar los métodos que deben implementarse todos los roles específicos de peso mosca.
Rol de peso concreto: implementa la interfaz especificada por el rol abstracto de Xiangyuan. Si hay un estado intrínseco, debe ser responsable de proporcionar espacio de almacenamiento para el estado intrínseco.
FlyweightFactory rol: Este papel es responsable de crear y administrar el papel de Xiangyuan. Este rol debe garantizar que el objeto de disfrute pueda ser compartido correctamente por el sistema. Cuando un objeto cliente llama a un objeto Xiangyuan, el papel de la fábrica de Xiangyuan verificará si ya existe un objeto Xiangyuan que cumple con los requisitos en el sistema. Si ya existe, el papel de fábrica de Xiangyuan debería proporcionar el objeto Xiangyuan existente; Si no hay un objeto Xiangyuan apropiado en el sistema, el papel de la fábrica de Xiangyuan debería crear un objeto Xiangyuan adecuado.
código fuente
Clase de personaje abstracta
Public Interface Flyweight {// Un método esquemático, el estado del parámetro es la operación pública del estado externo (estado de cadena);}El peso específico de la clase de caracteres de la enciclopedia tiene un estado intrínseco. En este ejemplo, representa una propiedad IntrinsicState del tipo de caracteres, y su valor debe asignarse cuando se crea el objeto Enciclopedia. Todos los estados intrínsecos no cambiarán después de que se cree el objeto.
Si un objeto de sacrificio tiene un estado externo, todos los estados externos deben almacenarse en el cliente. Al usar el objeto de sacrificio, el objeto de sacrificio pasará al objeto de sacrificio. Aquí solo hay un estado externo, y el estado del parámetro del método operator () es el estado externo que se pasa desde el exterior.
Public Class Concrete Flyweight Implements Flyweight {Private Caracter intrinsicState = null; / *** Constructor, el estado intrínseco se pasa como un parámetro* @param state*/ public concreteflyweight (estado de caracteres) {this.intrinsicState = state; } /** * Estado externo se pasa como un parámetro en el método, cambiando el comportamiento del método, * pero no cambia el estado intrínseco del objeto. */ @Override Public void Operation (State String State) {// TODO Método Generado automático stub System.out.println ("Intrinsic State =" + this.intrinsicState); System.out.println ("estado extrínsec =" + estado); }}Para la clase de roles de fábrica de Xiangyuan, debe señalarse que el cliente no puede instanciar directamente la clase de Xiangyuan específica, pero debe usar un método de fábrica () para obtener el objeto Xiangyuan. En términos generales, solo hay un objeto de fábrica Xiangyuan en todo el sistema, por lo que también se puede usar el modo Singleton.
Cuando el cliente necesita un objeto de disfrute simple, debe llamar al método de fábrica () de la fábrica de disfrutar y pasar en el estado interno requerido de la fábrica de disfrutar, y el método de fábrica genera el objeto de disfrutar requerido.
clase pública FlyWeightFactory {Mapa privado <caracteres, FlyWeight> archivos = new HashMap <caracteres, FlyWeight> (); Public Flyweight Factory (estado de caracteres) {// Primero busque el objeto del caché Flyweight Fly = files.get (estado); if (fly == null) {// Si el objeto no existe, cree un nuevo objeto de peso mosca fly = new Concreteflyweight (estado); // Agregar este nuevo objeto de peso mosca a los archivos de caché.put (estado, volar); } Volita de regreso; }}Clase de cliente
Cliente de clase pública {public static void main (string [] args) {// todo método generado automático stub flywightFactory factory = new FlyWeightFactory (); Flyweight Fly = factory.Factory (nuevo carácter ('a')); fly.operation ("primera llamada"); fly = factory.factory (nuevo carácter ('b')); fly.operation ("segunda llamada"); fly = factory.factory (nuevo carácter ('a')); fly.operation ("tercera llamada"); }}Aunque el cliente solicitó tres objetos de sacrificio, solo hay dos objetos de sacrificio creados realmente, que es lo que significa compartir. Los resultados de la operación son los siguientes:
Modo de disfrute complejo
En el modo de disfrute simple, todos los objetos de disfrute son objetos de disfrute simples, lo que significa que pueden compartirse directamente. También hay una situación más complicada en la que se combinan un modo de síntesis de uso extrínseco simple para formar un objeto extrínseco compuesto. Tales objetos compuestos de meta-disfruta no pueden ser compartidos por sí mismos, pero se pueden descomponer en objetos simples de la meta-disfruta, y estos últimos se pueden compartir.
Los personajes involucrados en el personaje compuesto de Xiangyuan son los siguientes:
Rol de peso mosca abstracta: ofrece una interfaz abstracta para especificar los métodos que deben implementarse todos los roles específicos de peso mosca.
Rol de peso concreto: implementa la interfaz especificada por el rol abstracto de Xiangyuan. Si hay un estado intrínseco, debe ser responsable de proporcionar espacio de almacenamiento para el estado intrínseco.
Rol de peso compositivo de peso: los objetos representados por el Compuesto Compartir no se pueden compartir, pero un objeto Compuesto Compartir puede descomponerse en múltiples combinaciones de objetos que simplemente comparten objetos. El papel extrínseco compuesto también se llama objeto extrínseco no compartido.
FlyweightFactory rol: Este papel es responsable de crear y administrar el papel de Xiangyuan. Este rol debe garantizar que el objeto de disfrute pueda ser compartido correctamente por el sistema. Cuando un objeto cliente llama a un objeto Xiangyuan, el papel de la fábrica de Xiangyuan verificará si ya existe un objeto Xiangyuan que cumple con los requisitos en el sistema. Si ya existe, el papel de fábrica de Xiangyuan debería proporcionar el objeto Xiangyuan existente; Si no hay un objeto Xiangyuan apropiado en el sistema, el papel de la fábrica de Xiangyuan debería crear un objeto Xiangyuan adecuado.
código fuente
Clase de personaje abstracta
Public Interface Flyweight {// Un método esquemático, el estado del parámetro es la operación pública del estado externo (estado de cadena);} Clase de rol de disfrutador específica
Public Class Concrete Flyweight Implements Flyweight {Private Caracter intrinsicState = null; / *** Constructor, el estado intrínseco se pasa como un parámetro* @param state*/ public concreteflyweight (estado de caracteres) {this.intrinsicState = state; } /** * Estado externo se pasa como un parámetro en el método, cambiando el comportamiento del método, * pero no cambia el estado intrínseco del objeto. */ @Override Public void Operation (State String State) {// TODO Método Generado automático stub System.out.println ("Intrinsic State =" + this.intrinsicState); System.out.println ("estado extrínsec =" + estado); }}El objeto extrínseco compuesto está compuesto por un objeto extrínseco puro a través de la compuesta, por lo que proporciona un método de gestión de agregación como add (). Dado que un meta objeto compuesto tiene diferentes elementos agregados, estos elementos agregados se agregan después de que se crea el meta objeto compuesto, esto en sí mismo significa que el estado del meta objeto compuesto cambiará, por lo que el meta objeto compuesto no se puede compartir.
El rol extrínseco compuesto implementa la interfaz especificada por el rol extrínseco abstracto, es decir, el método operation (). Este método tiene un parámetro que representa el estado externo del objeto extrínseco compuesto. Los estados externos de todos los elementos de un objeto de disfrute compuesto son iguales al estado externo del objeto de disfrute compuesto; Si bien los estados internos del objeto de disfrute simple contenido en un objeto de disfrute compuesto generalmente no son iguales, de lo contrario no habrá valor de uso.
Public Class ConcreteCompositEflyweight Implementa Flyweight {private Map <carácter, peso mosca> archivos = new HashMap <caracteres, FlyWeight> (); / *** Agregue un nuevo objeto meta-ahorro simple al clúster*/ public void add (tecla de caracteres, mosca de peso mosca) {files.put (clave, fly); } / *** Estado externo se pasa al método como un parámetro* / @Override Public Void Operation (State String State) {Flyweight Fly = null; for (objeto o: files.keyset ()) {fly = files.get (o); Fly.operation (estado); }}} El rol de fábrica de Xiangyuan proporciona dos métodos diferentes, uno para proporcionar un objeto Xiangyuan simple y el otro para proporcionar un objeto Xiangyuan compuesto.
clase pública FlyWeightFactory {Mapa privado <caracteres, FlyWeight> archivos = new HashMap <caracteres, FlyWeight> (); / *** Compuesto Método de fábrica Xiangyuan*/ Public Flyweight Factory (List <Artect> CompositEtate) {ConcreteCompositEflyweight CompositeFly = new ConcreteComposeFlyweight (); para (estado de caracteres: compositestate) {compositefly.add (state, this.factory (estado)); } return CompositeFly; } /*** Método de fábrica de enciclopedia simple* /Public Flyweight Factory (estado de caracteres) {// Primero busque el objeto desde el caché Flyweight Fly = files.get (estado); if (fly == null) {// Si el objeto no existe, cree un nuevo objeto de peso mosca fly = new Concreteflyweight (estado); // Agregar este nuevo objeto de peso mosca a los archivos de caché.put (estado, volar); } Volita de regreso; }} Roles de clientes
Cliente de clase pública {public static void main (string [] args) {list <tactay> composcesSEtate = new ArrayList <Artact> (); compositestate.add ('a'); compositestate.add ('b'); compositestate.add ('c'); compositestate.add ('a'); compositestate.add ('b'); FlyWeightFactory FlyFactory = new FlyWeightFactory (); Flyweight CompositeFly1 = FlyFactory.Factory (compositestate); Flyweight CompositeFly2 = FlyFactory.Factory (compositestate); compuestofly1.operation ("llamada compuesta"); System.out.println ("----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------- FlyFactory.Factory (State);Los resultados de la operación son los siguientes:
A partir de los resultados de la operación, se puede ver que el estado externo de todos los elementos de un objeto de disfrute compuesto es igual al estado externo del objeto de disfrute compuesto. Es decir, el estado de fortuna externa es igual a la llamada compuesta.
A partir de los resultados de la operación, se puede ver que los estados de connotación de un objeto existente simple contenido en un objeto existente compuesto son generalmente desiguales. Es decir, los estados internos son B, C y A.
A partir de los resultados en ejecución, se puede ver que el objeto Compuesto Compartir no se puede compartir. Es decir, el objeto creado al usar el mismo objeto compositate a través de la fábrica dos veces no es el mismo objeto.
A partir de los resultados de la operación, se puede ver que simplemente se puede compartir el elemento. Es decir, el objeto creado a través de la fábrica dos veces usando el mismo estado del objeto es el mismo objeto.
Pros y contras de la modelo Xiangyuan
La ventaja del modo Enciclopedia es que reduce en gran medida el número de objetos en la memoria. Sin embargo, el precio que paga hacer esto también es muy alto:
El modo Enciclopedia hace que el sistema sea más complejo. Para que los objetos se compartan, algunos estados deben ser externalizados, lo que complica la lógica del programa.
El modo de disfrutar externaliza el estado del objeto Disfruta, mientras que leer el estado externo hace que el tiempo de ejecución sea un poco más largo.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.