Ybadoo - Soluções em Software Livre
Tutoriais
Programação Orientada a Objetos

Para exercitar a utilização do padrão de projeto Flyweight, desenvolva um cache de Unidades da Federação (UF).

A interface Localidade (Flyweight) declara uma interface da qual as localidades podem receber e atuar sobre seus atributos.

A classe Unidade da Federação (ConcreteFlyweight) implementa a interface Localidade e armazena o estado de uma Unidade da Federação.

A classe Cache (FlyweightFactory) deve criar e gerenciar as Unidades da Federação, garantindo que as Localidades sejam compartilhadas apropriadamente.

A classe Cliente (Client) mantém uma referência para o Cache e solicita ao mesmo as instâncias das Unidades da Federação desejados.

 

Arquivo Localidade.java

/**
 * Copyright (C) 2009/2024 - Cristiano Lehrer (cristiano@ybadoo.com.br)
 *                  Ybadoo - Solucoes em Software Livre (www.ybadoo.com.br)
 *
 * Permission is granted to copy, distribute and/or modify this document
 * under the terms of the GNU Free Documentation License, Version 1.3
 * or any later version published by the Free Software Foundation; with
 * no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
 * A copy of the license is included in the section entitled "GNU
 * Free Documentation License".
 */

package com.ybadoo.tutoriais.poo;

/**
 * Flyweight
 */
public interface Localidade
{
  /**
   * Retornar o codigo da localidade
   * 
   * @return codigo da localidade
   */
  public String getCodigo();
  
  /**
   * Retornar o nome da localidade
   * 
   * @return nome da localidade
   */
  public String getNome();
}

Arquivo UnidadeFederacao.java

/**
 * Copyright (C) 2009/2024 - Cristiano Lehrer (cristiano@ybadoo.com.br)
 *                  Ybadoo - Solucoes em Software Livre (www.ybadoo.com.br)
 *
 * Permission is granted to copy, distribute and/or modify this document
 * under the terms of the GNU Free Documentation License, Version 1.3
 * or any later version published by the Free Software Foundation; with
 * no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
 * A copy of the license is included in the section entitled "GNU
 * Free Documentation License".
 */

package com.ybadoo.tutoriais.poo;

/**
 * ConcreteFlyweight
 */
public class UnidadeFederacao implements Localidade
{
  /**
   * Codigo da unidade da federacao
   */
  private String codigo;
  
  /**
   * Nome da unidade da federacao
   */
  private String nome;
  
  /**
   * Construtor para inicializar a unidade da federacao
   * 
   * @param codigo codigo da unidade da federacao
   * @param nome nome da unidade da federacao
   */
  public UnidadeFederacao(String codigo, String nome)
  {
    this.codigo = codigo;
    
    this.nome = nome;
  }

  /* (non-Javadoc)
   * @see com.ybadoo.tutoriais.poo.Localidade#getCodigo()
   */
  public String getCodigo()
  {
    return this.codigo;
  }

  /* (non-Javadoc)
   * @see com.ybadoo.tutoriais.poo.Localidade#getNome()
   */
  public String getNome()
  {
    return this.nome;
  }
}

Arquivo Cache.java

/**
 * Copyright (C) 2009/2024 - Cristiano Lehrer (cristiano@ybadoo.com.br)
 *                  Ybadoo - Solucoes em Software Livre (www.ybadoo.com.br)
 *
 * Permission is granted to copy, distribute and/or modify this document
 * under the terms of the GNU Free Documentation License, Version 1.3
 * or any later version published by the Free Software Foundation; with
 * no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
 * A copy of the license is included in the section entitled "GNU
 * Free Documentation License".
 */

package com.ybadoo.tutoriais.poo;

import java.util.HashMap;
import java.util.Map;

/**
 * FlyweightFactory
 */
public class Cache
{
  /**
   * Localidades armazenadas no cache
   */
  private Map<String, Localidade> cache;
  
  /**
   * Construtor padrao
   */
  public Cache()
  {
    this.cache = new HashMap<String, Localidade>();
  }
  
  /**
   * Criar a instancia da localidade
   * 
   * @param codigo codigo da localidade
   * @return instancia da localidade
   * @throws IllegalArgumentException codigo da localidade invalido
   */
  private Localidade createLocalidade(String codigo) throws IllegalArgumentException
  {
    if("AC".equals(codigo))
    {
      return new UnidadeFederacao("AC", "Acre");
    }
    
    if("AL".equals(codigo))
    {
      return new UnidadeFederacao("AL", "Alagoas");
    }
    
    if("AP".equals(codigo))
    {
      return new UnidadeFederacao("AP", "Amapá");
    }
    
    if("AM".equals(codigo))
    {
      return new UnidadeFederacao("AM", "Amazonas");
    }
    
    if("BA".equals(codigo))
    {
      return new UnidadeFederacao("BA", "Bahia");
    }
    
    if("CE".equals(codigo))
    {
      return new UnidadeFederacao("CE", "Ceará");
    }
    
    if("DF".equals(codigo))
    {
      return new UnidadeFederacao("DF", "Distrito Federal");
    }
    
    if("ES".equals(codigo))
    {
      return new UnidadeFederacao("ES", "Espírito Santo");
    }
    
    if("GO".equals(codigo))
    {
      return new UnidadeFederacao("GO", "Goiás");
    }
    
    if("MA".equals(codigo))
    {
      return new UnidadeFederacao("MA", "Maranhão");
    }
    
    if("MT".equals(codigo))
    {
      return new UnidadeFederacao("MT", "Mato Grosso");
    }
    
    if("MS".equals(codigo))
    {
      return new UnidadeFederacao("MS", "Mato Grosso do Sul");
    }
    
    if("MG".equals(codigo))
    {
      return new UnidadeFederacao("MG", "Minas Gerais");
    }
    
    if("PA".equals(codigo))
    {
      return new UnidadeFederacao("PA", "Pará");
    }
    
    if("PB".equals(codigo))
    {
      return new UnidadeFederacao("PB", "Paraíba");
    }
    
    if("PR".equals(codigo))
    {
      return new UnidadeFederacao("PR", "Paraná");
    }
    
    if("PE".equals(codigo))
    {
      return new UnidadeFederacao("PE", "Pernambuco");
    }
    
    if("PI".equals(codigo))
    {
      return new UnidadeFederacao("PI", "Piauí");
    }
    
    if("RJ".equals(codigo))
    {
      return new UnidadeFederacao("RJ", "Rio de Janeiro");
    }
    
    if("RN".equals(codigo))
    {
      return new UnidadeFederacao("RN", "Rio Grande do Norte");
    }
    
    if("RS".equals(codigo))
    {
      return new UnidadeFederacao("RS", "Rio Grande do Sul");
    }
    
    if("RO".equals(codigo))
    {
      return new UnidadeFederacao("RO", "Rondônia");
    }
    
    if("RR".equals(codigo))
    {
      return new UnidadeFederacao("RR", "Roraima");
    }
    
    if("SC".equals(codigo))
    {
      return new UnidadeFederacao("SC", "Santa Catarina");
    }
    
    if("SP".equals(codigo))
    {
      return new UnidadeFederacao("SP", "São Paulo");
    }
    
    if("SE".equals(codigo))
    {
      return new UnidadeFederacao("SE", "Sergipe");
    }
    
    if("TO".equals(codigo))
    {
      return new UnidadeFederacao("TO", "Tocantins");
    }
    
    throw new IllegalArgumentException(codigo); 
  }
  
  /**
   * Retornar a instancia da localidade
   * 
   * @param codigo codigo da localidade
   * @return instancia da localidade
   */
  public Localidade getLocalidade(String codigo)
  {
    if(!this.cache.containsKey(codigo))
    {
      this.cache.put(codigo, createLocalidade(codigo));
    }
    
    return this.cache.get(codigo);
  }
}

Arquivo Cliente.java

/**
 * Copyright (C) 2009/2024 - Cristiano Lehrer (cristiano@ybadoo.com.br)
 *                  Ybadoo - Solucoes em Software Livre (www.ybadoo.com.br)
 *
 * Permission is granted to copy, distribute and/or modify this document
 * under the terms of the GNU Free Documentation License, Version 1.3
 * or any later version published by the Free Software Foundation; with
 * no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
 * A copy of the license is included in the section entitled "GNU
 * Free Documentation License".
 */

package com.ybadoo.tutoriais.poo;

/**
 * Client
 */
public class Cliente
{
  /**
   * Metodo principal da linguagem de programacao Java
   * 
   * @param args argumentos da linha de comando (nao utilizado)
   */
  public static void main(String[] args)
  {
    Cache cache = new Cache();
    
    // com.ybadoo.tutoriais.poo.UnidadeFederacao@746ac18c
    System.out.println(cache.getLocalidade("DF"));
    
    // com.ybadoo.tutoriais.poo.UnidadeFederacao@49b3d1e5
    System.out.println(cache.getLocalidade("SC"));
    
    // com.ybadoo.tutoriais.poo.UnidadeFederacao@746ac18c
    System.out.println(cache.getLocalidade("DF"));
    
    // com.ybadoo.tutoriais.poo.UnidadeFederacao@49b3d1e5
    System.out.println(cache.getLocalidade("SC"));
  }
}