No livro do Dr. Yan Hong, "Java and Mode", começa com a descrição do modo de peso mosca:
O peso da mosca refere -se ao nível de peso mais leve, ou seja, "peso mosca" ou "nível de chuva". A tradução do "Modo Xienyuan" é escolhida aqui porque isso pode refletir melhor a intenção do modo. O padrão de enciclopédia é o padrão estrutural de um objeto. O modo de enciclopédia suporta com eficiência um grande número de objetos de granulação fina de maneira compartilhada.
Tipo de string em java
No idioma java, o tipo de sequência usa o modo de enciclopédia. O objeto String é do tipo final e não pode ser alterado depois de ser criado. Em Java, as constantes de cordas estão presentes no pool constante. O Java garantirá que uma constante de corda tenha apenas uma cópia no pool constante. String a = "ABC", onde "ABC" é uma constante de string.
classe pública teste {public static void main (string [] args) {string a = "abc"; String b = "abc"; System.out.println (a == b); }}O resultado no exemplo acima é verdadeiro, o que significa que A e B se referem à mesma string constante "ABC" no pool constante. Esse design evita grandes quantidades desnecessárias de consumo de recursos geradas ao criar objetos n ou mais idênticos.
A estrutura do modelo de diversão
O modelo de desfruta adota um compartilhamento para evitar a sobrecarga de ter o mesmo objeto de conteúdo. A coisa mais comum e intuitiva sobre essa sobrecarga é a perda de memória. A chave para compartilhar o objeto da enciclopédia é distinguir entre o estado interno e o estado externo .
Um estado intrínseco é armazenado dentro do objeto Xiangyuan e não varia com o meio ambiente. Portanto, um elemento sacrificial pode ter um estado intrínseco e pode ser compartilhado.
Um estado externo muda com a mudança do ambiente e não pode ser compartilhado. O estado externo do objeto Xiangyuan deve ser salvo pelo cliente e, depois que o objeto Xiangyuan é criado, ele é passado para o objeto Xiangyuan quando precisar ser usado. Os estados externos não podem afetar o estado interno do objeto vivo, eles são independentes um do outro.
O modo Aproveitar Yuan pode ser dividido em duas formas: o modo Aproveitar Yuan e o composto desfrutar do modo Yuan.
Modo de prazer simples
No modo existente simples, todos os objetos existentes podem ser compartilhados.
Os papéis envolvidos no modo de prazer simples são os seguintes:
Função do peso da mosca abstrato: fornece uma interface abstrata para especificar os métodos que todas as funções específicas do peso da mosca precisam ser implementadas.
Função do peso concreto: implementa a interface especificada pelo papel abstrato xiangyuan. Se houver um estado intrínseco, você deve ser responsável por fornecer espaço de armazenamento para o estado intrínseco.
Função FlyweightFactory: Essa função é responsável por criar e gerenciar o papel Xiangyuan. Essa função deve garantir que o objeto de prazer possa ser compartilhado corretamente pelo sistema. Quando um objeto cliente chama um objeto Xiangyuan, a função de fábrica Xiangyuan verificará se já existe um objeto Xiangyuan que atenda aos requisitos no sistema. Se já existe, o papel da fábrica Xiangyuan deve fornecer o objeto Xiangyuan existente; Se não houver um objeto Xiangyuan apropriado no sistema, a função de fábrica Xiangyuan deve criar um objeto Xiangyuan adequado.
código -fonte
Classe de personagem abstrata
Public Interface Flyweight {// Um método esquemático, o estado dos parâmetros é a operação de vazio público do estado externo (estado da string);}A classe de caracteres da enciclopédia específica concreta -peso tem um estado intrínseco. Neste exemplo, uma propriedade Intrinsicstate do tipo de caractere representa e seu valor deve ser atribuído quando o objeto da enciclopédia for criado. Todos os estados intrínsecos não mudarão após a criação do objeto.
Se um objeto de sacrifício tiver um estado externo, todos os estados externos devem ser armazenados no cliente. Ao usar o objeto de sacrifício, o objeto de sacrifício será passado para o objeto de sacrifício pelo cliente. Existe apenas um estado externo aqui, e o estado do parâmetro do método da operação () é o estado externo passado de fora.
classe pública concreteflyweight implementa o peso da mosca {caractere privado intrinsicstate = null; / *** Construtor, o estado intrínseco é passado como um parâmetro* @param estado*/ public concreteflyweight (estado do caractere) {this.intrinsicstate = state; } /** * O estado externo é passado como um parâmetro para o método, alterando o comportamento do método, * mas não alterando o estado intrínseco do objeto. */ @Override Public void Operation (State String) {// TODO Method Stub System.out.println ("Intrinsic state =" + this.IntrinsicState); System.out.println ("Estado extrínseco =" + estado); }}Para a classe de função da fábrica Xiangyuan, deve -se ressaltar que o cliente não pode instanciar diretamente a classe Xiangyuan específica, mas deve usar um método de fábrica () para obter o objeto Xiangyuan. De um modo geral, existe apenas um objeto de fábrica Xiangyuan em todo o sistema, para que o modo singleton também possa ser usado.
Quando o cliente precisa de um objeto de diversão simples, ele precisa chamar o método da fábrica () da fábrica de desfrutar e passar no estado interno necessário da fábrica de desfrutar, e o método da fábrica gera o objeto Aproveite necessário.
classe pública FlyweightFactory {private mapa <caractere, Flyweight> arquivos = novo hashmap <caractere, Flyweight> (); public Flyweight Factory (estado do caractere) {// Primeiro procure o objeto do cache Flyweight Fly = files.get (estado); if (voar == null) {// Se o objeto não existir, crie um novo objeto de peso mosca voar = novo concretoflyweight (estado); // Adicione este novo objeto de peso mosca aos arquivos de cache.put (estado, mosca); } retornar voar; }}Classe de cliente
public class Client {public static void main (String [] args) {// TODO Método Auto-Generado Stub FlyweightFactory Factory = new FlyweightFactory (); Mosca mosca = fábrica.factory (novo caractere ('a')); fly.operation ("Primeira chamada"); fly = Factory.Factory (novo caractere ('B')); fly.operation ("Segunda chamada"); fly = factory.Factory (novo caractere ('a')); fly.operation ("Terceira chamada"); }}Embora o cliente tenha solicitado três objetos de sacrifício, existem apenas dois objetos de sacrifício, que são o que o compartilhamento significa. Os resultados da operação são os seguintes:
Modo de aproveitamento complexo
No modo de prazer simples, todos os objetos de prazer são objetos simples de prazer, o que significa que eles podem ser compartilhados diretamente. Há também uma situação mais complicada em que algum modo de síntese de uso extrínseco simples é combinado para formar um objeto extrínseco composto. Tais objetos de meta-desfruta compostos não podem ser compartilhados por si mesmos, mas podem ser divididos em objetos simples de meta-alegria, e o último pode ser compartilhado.
Os personagens envolvidos no personagem composto Xiangyuan são os seguintes:
Função do peso da mosca abstrato: fornece uma interface abstrata para especificar os métodos que todas as funções específicas do peso da mosca precisam ser implementadas.
Função do peso concreto: implementa a interface especificada pelo papel abstrato xiangyuan. Se houver um estado intrínseco, você deve ser responsável por fornecer espaço de armazenamento para o estado intrínseco.
Função CompositEcomposeFlyWeight: Os objetos representados pelo compartilhamento composto não podem ser compartilhados, mas um objeto de compartilhamento composto pode ser decomposto em várias combinações de objetos que são simplesmente objetos de compartilhamento. O papel extrínseco composto também é chamado de objeto extrínseco não compartilhado.
Função FlyweightFactory: Essa função é responsável por criar e gerenciar o papel Xiangyuan. Essa função deve garantir que o objeto de prazer possa ser compartilhado corretamente pelo sistema. Quando um objeto cliente chama um objeto Xiangyuan, a função de fábrica Xiangyuan verificará se já existe um objeto Xiangyuan que atenda aos requisitos no sistema. Se já existe, o papel da fábrica Xiangyuan deve fornecer o objeto Xiangyuan existente; Se não houver um objeto Xiangyuan apropriado no sistema, a função de fábrica Xiangyuan deve criar um objeto Xiangyuan adequado.
código -fonte
Classe de personagem abstrata
Public Interface Flyweight {// Um método esquemático, o estado dos parâmetros é a operação de vazio público do estado externo (estado da string);} Classe de desfrutar específicos
classe pública concreteflyweight implementa o peso da mosca {caractere privado intrinsicstate = null; / *** Construtor, o estado intrínseco é passado como um parâmetro* @param estado*/ public concreteflyweight (estado do caractere) {this.intrinsicstate = state; } /** * O estado externo é passado como um parâmetro para o método, alterando o comportamento do método, * mas não alterando o estado intrínseco do objeto. */ @Override Public void Operation (State String) {// TODO Method Stub System.out.println ("Intrinsic state =" + this.IntrinsicState); System.out.println ("Estado extrínseco =" + estado); }}O objeto extrínseco composto é composto por um objeto extrínseco puro por meio de composição, por isso fornece um método de gerenciamento de agregação como Add (). Como um meta objeto composto possui diferentes elementos agregados, esses elementos agregados são adicionados após a criação do meta composto, isso em si significa que o estado do meta objeto composto mudará, para que o meta objeto composto não possa ser compartilhado.
A função extrínseca composta implementa a interface especificada pelo papel extrínseco abstrato, ou seja, o método da Operação (). Este método possui um parâmetro que representa o estado externo do objeto extrínseco composto. Os estados externos de todos os elementos de um objeto de aproveitamento composto são iguais ao estado externo do objeto de aproveitamento composto; Embora os estados internos do objeto de prazer simples contido em um objeto de aproveitamento composto geralmente não sejam iguais, caso contrário, não haverá valor de uso.
classe pública ConcreteComPetestFlyweight implementa o peso da mosca {mapa privado <caractere, Flyweight> arquivos = new Hashmap <caractere, Flyweight> (); / *** Adicione um novo objeto de meta simples ao cluster*/ public void add (chave do caractere, mosca com peso mosca) {files.put (chave, mosca); } /** for (objeto o: files.keyset ()) {fly = files.get (o); fly.operation (estado); }}} A função de fábrica Xiangyuan fornece dois métodos diferentes, um para fornecer um objeto Xiangyuan simples e outro para fornecer um objeto Xiangyuan composto.
classe pública FlyweightFactory {private mapa <caractere, Flyweight> arquivos = novo hashmap <caractere, Flyweight> (); / *** Método da fábrica Xiangyuan composto*/ Fábrica de Flyweight Public (List <Aclá> Compositestate) {concretecompositionflyweight compositefly = new concreteComposeFlyweight (); para (estado do personagem: compositestate) {compositefly.add (estado, this.factory (estado)); } return compósitofly; } /*** Método da fábrica de enciclopédia simples* /Fábrica pública de peso mosca (estado do caractere) {// Primeiro, procure o objeto do cache Flyweight Fly = files.get (estado); if (voar == null) {// Se o objeto não existir, crie um novo objeto de peso mosca voar = novo concretoflyweight (estado); // Adicione este novo objeto de peso mosca aos arquivos de cache.put (estado, mosca); } retornar voar; }} Funções do cliente
classe pública client {public static void main (string [] args) {list <charial> compositestate = new ArrayList <personagem> (); compositestate.add ('a'); compositestate.add ('b'); compositestate.add ('c'); compositestate.add ('a'); compositestate.add ('b'); FlyweightFactory Flyfactory = new FlyweightFactory (); Flyweight CompositeFly1 = FlyFactory.Factory (Compositestate); Composite de peso flyweight2 = flyfactory.factory (compositestate); compósitofly1.operação ("chamada composta"); System.out.println ("---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ flyfactory.factory (estado);Os resultados da operação são os seguintes:
Nos resultados da operação, pode -se observar que o estado externo de todos os elementos de um objeto de aproveitamento composto é igual ao estado externo do objeto de aproveitamento composto. Ou seja, o estado da fortuna externo é igual a chamada composta.
A partir dos resultados da operação, pode -se observar que os estados de conotação de um objeto existente simples contido em um objeto existente composto são geralmente desiguais. Ou seja, os estados internos são B, C e a.
A partir dos resultados em execução, pode -se observar que o objeto de compartilhamento composto não pode ser compartilhado. Isto é, o objeto criado usando o mesmo objeto compositor através da fábrica duas vezes não é o mesmo objeto.
A partir dos resultados da operação, pode -se observar que simplesmente apreciar o elemento pode ser compartilhado. Ou seja, o objeto criado através da fábrica duas vezes usando o mesmo estado de objeto é o mesmo objeto.
Prós e contras do modelo Xiangyuan
A vantagem do modo de enciclopédia é que ele reduz bastante o número de objetos na memória. No entanto, o preço que paga para fazer isso também é muito alto:
O modo de enciclopédia torna o sistema mais complexo. Para que os objetos sejam compartilhados, algum estado precisa ser externalizado, o que complica a lógica do programa.
O modo de desfrutar externaliza o estado do objeto Aproveitar, enquanto a leitura do estado externo torna o tempo de execução um pouco mais longo.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.