flyweight
Flyweight (FLYWEIGHT) é usado principalmente para reduzir o número de objetos criados para reduzir o uso de memória e melhorar o desempenho. Este tipo de padrões de design pertencem modelo estrutural, que proporciona uma redução no número de objectos para melhorar a estrutura do objecto de um modo requerido pela aplicação.
Flyweight tente reutilizar objetos existentes do mesmo, se o objeto correspondente não for encontrada, um novo objeto é criado. Vamos desenhar 20 círculos distribuídos em diferentes locais através da criação de cinco objetos para demonstrar esse padrão. Desde apenas cinco tipos de cores disponíveis, de modo que o atributo de cor é usada para verificar um objetocírculoexistente.
introdução
Intenção: Usar compartilhamento para suportar grandes quantidades de objetos de granulação fina.
Principalmente para resolver: Em um grande número de objetos, pode causar estouro de memória, montamos uma parte em que o resumo, se você tem o mesmo pedido de serviço diretamente de volta os objetos existentes na memória, para evitar re-criado.
Quando se deve utilizar: 1, o sistema tem um grande número de objectos.2, esses objetos consumir muita memória. 3, o estado da maioria destes objectos pode ser exteriorizada. 4, muitos desses objetos podem ser divididos em grupos de acordo com o estado intrínseco, quando o objeto é removido dos objetos Yun exteriores, cada objeto pode ser definido usando um objeto em seu lugar. 5, o sistema não depende da identidade desses objectos, estes objectos são indistinguíveis.
Como corrigir: Analisando com um código único de identificação, se existir em memória, o código único de identificação dos objectos identificados é devolvido.
A chave código: HashMap armazenado com esses objetos.
Exemplos de aplicação: 1, JAVA em String, se ele retorna, se não, em seguida, criar uma cadeia armazenada na área de buffer de cadeia no interior.2, o banco de dados conjunto de dados.
Vantagens: reduzir significativamente a criação de objectos, reduzindo a memória do sistema, de modo que a eficiência é melhorada.
Desvantagens: aumento na carga do sistema, temos de separar o status de estado interno e externo, e estado externo da natureza são inerentemente não deve mudar com o estado interno de mudança, caso contrário ele irá criar sistema de caos.
cenários de uso: 1, o sistema tem um grande número de objetos semelhantes.2, precisa de reunir cena.
Nota: 1, preste atenção ao estado da divisão interna e externa do Estado, ou pode causar problemas de thread-segurança.2, a classe deve ter um objecto de fábrica para ser controlado.
realização
Nós vamos criar uma interfaceFormae implementação da interfaceForma Círculoclasses de entidade. O próximo passo é definir classes de fábricaShapeFactory.
ShapeFactoryter umCírculodeHashMap,onde ocírculochave cor nomeada objeto. Sempre que um pedido é recebido, ele irá criar um círculo cor específica.ShapeFactoryverificar a suaHashMapno objeto círculo, se os objetosCírculoencontrado, o objeto é retornado, caso contrário ele irá criar um armazenado no hashmap para se preparar para posterior utilização do novo objeto, e o objeto é devolvido ao cliente.
FlyWeightPatternDemo,nossa demo para obter a classe a ser usada objetoShapeShapeFactory. Ele irá transmitir informações(vermelho / verde / azul / preto/ branco) paraShapeFactory,ele precisa obter a cor do objeto.
passo 1
Criar uma interface.
Shape.java
Forma interface pública { draw void (); }
passo 2
Criar classe de entidade que implementa a interface.
Circle.java
classe pública Círculo implementa Forma { String cor privado; private int x; int y privado; raio int privado; Círculo pública (cor String) { this.color = cor; } setX public void (int x) { this.x = x; } setY public void (int y) { this.y = y; } setRadius public void (raio int) { this.radius = raio; } @Override draw public void () { System.out.println ( "Circle: Draw () [Color:" + cor + ", X:" + x + ", Y:" + y + ", raio:" + raio); } }
passo 3
Criar uma fábrica para produzir as classes de entidade objeto com base na informação dada.
ShapeFactory.java
importação java.util.HashMap; ShapeFactory classe pública { privada HashMap static final <String, Shape> circleMap = new HashMap (); pública getCircle Forma estática (cor String) { Círculo círculo = (Circle) circleMap.get (cor); if (círculo == null) { círculo = new Circle (cor); circleMap.put (cor, círculo); System.out.println ( "Criando círculo de cor:" + cor); } voltar círculo; } }
passo 4
Use a fábrica para obter um objeto de entidade da classe, passando a informação de cor.
FlyweightPatternDemo.java
classe pública FlyweightPatternDemo { cores private static final String [] = { "Vermelho", "Verde", "Blue", "branco", "Black"}; main (String [] args) public static void { for (int i = 0; i <20; ++ i) { Círculo círculo = (Círculo) ShapeFactory.getCircle (getRandomColor ()); circle.setX (getRandomX ()); circle.setY (getRandomY ()); circle.setRadius (100); circle.draw (); } } Static String privada getRandomColor () { retornam cores [(int) (Math.random () * colors.length)]; } privada getRandomX static int () { retorno (int) (Math.random () * 100); } privada getRandomY static int () { retorno (int) (Math.random () * 100); } }
passo 5
Verifique saída.
Criando círculo de cor: preto Circle: Draw () [Cor: Preto, x: 36, y: 71, radius: 100 Criando círculo de cor: verde Circle: Draw () [Cor: Verde, x: 27, y: 27, radius: 100 Criando círculo de cor: Branco Circle: Draw () [Cor: branco, x: 64, y: 10, radius: 100 Criando círculo de cor: vermelho Circle: Draw () [Cor: Vermelho, x: 15, y: 44, radius: 100 Circle: Draw () [Cor: Verde, x: 19, y: 10, radius: 100 Circle: Draw () [Cor: Verde, x: 94, y: 32, radius: 100 Circle: Draw () [Cor: branco, x: 69, y: 98, radius: 100 Criando círculo de cores: azul Circle: Draw () [Cor: Azul, x: 13, y: 4, raio: 100 Circle: Draw () [Cor: Verde, x: 21, y: 21, radius: 100 Circle: Draw () [Cor: Azul, x: 55, y: 86, radius: 100 Circle: Draw () [Cor: branco, x: 90, y: 70, radius: 100 Circle: Draw () [Cor: Verde, x: 78, y: 3, radius: 100 Circle: Draw () [Cor: Verde, x: 64, y: 89, radius: 100 Circle: Draw () [Cor: Azul, x: 3, y: 91, radius: 100 Circle: Draw () [Cor: Azul, x: 62, y: 82, radius: 100 Circle: Draw () [Cor: Verde, x: 97, y: 61, radius: 100 Circle: Draw () [Cor: Verde, x: 86, y: 12, radius: 100 Circle: Draw () [Cor: Verde, x: 38, y: 93, radius: 100 Circle: Draw () [Cor: Vermelho, x: 76, y: 82, radius: 100 Circle: Draw () [Cor: Azul, x: 95, y: 82, radius: 100