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

Desenvolva uma classe chamada PlatonicSolid para representar um Sólido Platônico. A classe possui um único atributo denominado length, que representa o comprimento da aresta do Sólido Platônico, do tipo int e cujo valor deve ser maior ou igual a um. A classe possui um único construtor, que recebe como parâmetro o comprimento da aresta do Sólido Platônico. O comprimento da aresta do Sólido Platônico pode ser obtido pelo usuário por meio do método getLength(). A quantidade de faces, arestas e vértices do Sólido Platônico podem ser obitos pelo usuário por meio dos métodos getFaces(), getEdges() e getVertices(), respectivamente. A classe também apresenta os métodos area() e volume(), que retornam a área e o volume do Sólido Platônico, respectivamente.

Estenda a classe PlatonicSolid para implementar uma classe chamada Tetrahedron para representar um tetraedro, ou seja, um poliedro regular de quatro faces, considerado um dos cinco Sólidos Platônicos. Um tetraedro possui quatro faces, seis arestas e quatro vértices. A área de um tetraedro de aresta a é obtida pela fórmula √3 * a2. O volume de um tetraedro de aresta a é obtida pela fórmula √2 / 12 * a3.

Estenda a classe PlatonicSolid para implementar uma classe chamada Hexahedron para representar um hexaedro, ou seja, um poliedro regular de seis faces, considerado um dos cinco Sólidos Platônicos. Um hexaedro possui seis faces, doze arestas e oito vértices. A área de um hexaedro de aresta a é obtida pela fórmula 6 * a2. O volume de um hexaedro de aresta a é obtida pela fórmula a3.

Estenda a classe PlatonicSolid para implementar uma classe chamada Octahedron para representar um octaedro, ou seja, um poliedro regular de oito faces, considerado um dos cinco Sólidos Platônicos. Um octaedro possui oito faces, doze arestas e seis vértices. A área de um octaedro de aresta a é obtida pela fórmula 2 * √3 * a2. O volume de um octaedro de aresta a é obtida pela fórmula √2 / 3 * a3.

Estenda a classe PlatonicSolid para implementar uma classe chamada Dodecahedron para representar um dodecaedro, ou seja, um poliedro regular de doze faces, considerado um dos cinco Sólidos Platônicos. Um dodecaedro possui doze faces, trinta arestas e vinte vértices. A área de um dodecaedro de aresta a é obtida pela fórmula 3 * √(25 + 10 * √5) * a2. O volume de um dodecaedro de aresta a é obtida pela fórmula 1 / 4 * (15 + 7 * √5) * a3.

Estenda a classe PlatonicSolid para implementar uma classe chamada Icosahedron para representar um icosaedro, ou seja, um poliedro regular de vinte faces, considerado um dos cinco Sólidos Platônicos. Um icosaedro possui vinte faces, trinta arestas e doze vértices. A área de um icosaedro de aresta a é obtida pela fórmula 5 * √3 * a2. O volume de um icosaedro de aresta a é obtida pela fórmula 5 / 12 * (3 + √5) * a3.

Desenvolva uma classe chamada PlatonicSolidCache para representar um cache de sólidos platônicos, permitindo que os mesmos sejam compartilhados apropriadamente pela aplicação. Utilize o padrão de projeto Flyweight para auxiliar no desenvolvimento da solução.

 

Diagrama de classes
Diagrama de classes da solução em Java

Arquivo PlatonicSolid.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;

/**
 * Classe responsavel pela representacao de um solido platonico
 *
 * Classe Flyweight do padrao de projetos Flyweight
 */
public abstract class PlatonicSolid
{
  /**
   * Comprimento da aresta do solido platonico
   */
  private int length;

  /**
   * Construtor para inicializar o comprimento da aresta do solido platonico
   *
   * @param length comprimento da aresta do solido platonico
   */
  protected PlatonicSolid(int length)
  {
    if(length > 0)
    {
      this.length = length;
    }
    else
    {
      this.length = 1;
    }
  }

  /**
   * Retornar a quantidade de arestas do solido platonico
   *
   * @return quantidade de arestas do solido platonico
   */
  public abstract int getEdges();

  /**
   * Retornar a quantidade de faces do solido platonico
   *
   * @return quantidade de faces do solido platonico
   */
  public abstract int getFaces();

  /**
   * Retornar a quantidade de vertices do solido platonico
   *
   * @return quantidade de vertices do solido platonico
   */
  public abstract int getVertices();

  /**
   * Retornar o comprimento da aresta do solido platonico
   *
   * @return comprimento da aresta do solido platonico
   */
  public int getLength()
  {
    return length;
  }

  /**
   * Retornar a area do solido platonico
   *
   * @return area do solido platonico
   */
  public abstract double area();

  /**
   * Retornar o volume do solido platonico
   *
   * @return volume do solido platonico
   */
  public abstract double volume();
}

Arquivo Tetrahedron.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;

/**
 * Classe responsavel pela representacao de um tetraedro
 *
 * Classe ConcreteFlyweight do padrao de projetos Flyweight
 */
public class Tetrahedron extends PlatonicSolid
{
  /**
   * Construtor para inicializar o comprimento da aresta do tetraedro
   *
   * @param length comprimento da aresta do tetraedro
   */
  public Tetrahedron(int length)
  {
    super(length);
  }

  /* (non-Javadoc)
   * @see com.ybadoo.tutoriais.poo.PlatonicSolid#getEdges()
   */
  @Override
  public int getEdges()
  {
    return 6;
  }

  /* (non-Javadoc)
   * @see com.ybadoo.tutoriais.poo.PlatonicSolid#getFaces()
   */
  @Override
  public int getFaces()
  {
    return 4;
  }

  /* (non-Javadoc)
   * @see com.ybadoo.tutoriais.poo.PlatonicSolid#getVertices()
   */
  @Override
  public int getVertices()
  {
    return 4;
  }

  /* (non-Javadoc)
   * @see com.ybadoo.tutoriais.poo.PlatonicSolid#area()
   */
  @Override
  public double area()
  {
    return Math.sqrt(3.0) * Math.pow(getLength(), 2.0);
  }

  /* (non-Javadoc)
   * @see com.ybadoo.tutoriais.poo.PlatonicSolid#volume()
   */
  @Override
  public double volume()
  {
    return Math.sqrt(2.0) / 12.0 * Math.pow(getLength(), 3.0);
  }
}

Arquivo Hexahedron.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;

/**
 * Classe responsavel pela representacao de um hexaedro
 *
 * Classe ConcreteFlyweight do padrao de projetos Flyweight
 */
public class Hexahedron extends PlatonicSolid
{
  /**
   * Construtor para inicializar o comprimento da aresta do hexaedro
   *
   * @param length comprimento da aresta do hexaedro
   */
  public Hexahedron(int length)
  {
    super(length);
  }

  /* (non-Javadoc)
   * @see com.ybadoo.tutoriais.poo.PlatonicSolid#getEdges()
   */
  @Override
  public int getEdges()
  {
    return 12;
  }

  /* (non-Javadoc)
   * @see com.ybadoo.tutoriais.poo.PlatonicSolid#getFaces()
   */
  @Override
  public int getFaces()
  {
    return 6;
  }

  /* (non-Javadoc)
   * @see com.ybadoo.tutoriais.poo.PlatonicSolid#getVertices()
   */
  @Override
  public int getVertices()
  {
    return 8;
  }

  /* (non-Javadoc)
   * @see com.ybadoo.tutoriais.poo.PlatonicSolid#area()
   */
  @Override
  public double area()
  {
    return 6.0 * Math.pow(getLength(), 2.0);
  }

  /* (non-Javadoc)
   * @see com.ybadoo.tutoriais.poo.PlatonicSolid#volume()
   */
  @Override
  public double volume()
  {
    return Math.pow(getLength(), 3.0);
  }
}

Arquivo Octahedron.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;

/**
 * Classe responsavel pela representacao de um octaedro
 *
 * Classe ConcreteFlyweight do padrao de projetos Flyweight
 */
public class Octahedron extends PlatonicSolid
{
  /**
   * Construtor para inicializar o comprimento da aresta do octaedro
   *
   * @param length comprimento da aresta do octaedro
   */
  public Octahedron(int length)
  {
    super(length);
  }

  /* (non-Javadoc)
   * @see com.ybadoo.tutoriais.poo.PlatonicSolid#getEdges()
   */
  @Override
  public int getEdges()
  {
    return 12;
  }

  /* (non-Javadoc)
   * @see com.ybadoo.tutoriais.poo.PlatonicSolid#getFaces()
   */
  @Override
  public int getFaces()
  {
    return 8;
  }

  /* (non-Javadoc)
   * @see com.ybadoo.tutoriais.poo.PlatonicSolid#getVertices()
   */
  @Override
  public int getVertices()
  {
    return 6;
  }

  /* (non-Javadoc)
   * @see com.ybadoo.tutoriais.poo.PlatonicSolid#area()
   */
  @Override
  public double area()
  {
    return 2.0 * Math.sqrt(3.0) * Math.pow(getLength(), 2.0);
  }

  /* (non-Javadoc)
   * @see com.ybadoo.tutoriais.poo.PlatonicSolid#volume()
   */
  @Override
  public double volume()
  {
    return Math.sqrt(2.0) / 3.0 * Math.pow(getLength(), 3.0);
  }
}

Arquivo Dodecahedron.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;

/**
 * Classe responsavel pela representacao de um dodecaedro
 *
 * Classe ConcreteFlyweight do padrao de projetos Flyweight
 */
public class Dodecahedron extends PlatonicSolid
{
  /**
   * Construtor para inicializar o comprimento da aresta do dodecaedro
   *
   * @param length comprimento da aresta do dodecaedro
   */
  public Dodecahedron(int length)
  {
    super(length);
  }

  /* (non-Javadoc)
   * @see com.ybadoo.tutoriais.poo.PlatonicSolid#getEdges()
   */
  @Override
  public int getEdges()
  {
    return 30;
  }

  /* (non-Javadoc)
   * @see com.ybadoo.tutoriais.poo.PlatonicSolid#getFaces()
   */
  @Override
  public int getFaces()
  {
    return 12;
  }

  /* (non-Javadoc)
   * @see com.ybadoo.tutoriais.poo.PlatonicSolid#getVertices()
   */
  @Override
  public int getVertices()
  {
    return 20;
  }

  /* (non-Javadoc)
   * @see com.ybadoo.tutoriais.poo.PlatonicSolid#area()
   */
  @Override
  public double area()
  {
    return 3.0 * Math.sqrt(25.0 + 10.0 * Math.sqrt(5.0))
      * Math.pow(getLength(), 2.0);
  }

  /* (non-Javadoc)
   * @see com.ybadoo.tutoriais.poo.PlatonicSolid#volume()
   */
  @Override
  public double volume()
  {
    return 1.0 / 4.0 * (15.0 + 7.0 * Math.sqrt(5.0))
      * Math.pow(getLength(), 3.0);
  }
}

Arquivo Icosahedron.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;

/**
 * Classe responsavel pela representacao de um icosaedro
 *
 * Classe ConcreteFlyweight do padrao de projetos Flyweight
 */
public class Icosahedron extends PlatonicSolid
{
  /**
   * Construtor para inicializar o comprimento da aresta do icosaedro
   *
   * @param length comprimento da aresta do icosaedro
   */
  public Icosahedron(int length)
  {
    super(length);
  }

  /* (non-Javadoc)
   * @see com.ybadoo.tutoriais.poo.PlatonicSolid#getEdges()
   */
  @Override
  public int getEdges()
  {
    return 30;
  }

  /* (non-Javadoc)
   * @see com.ybadoo.tutoriais.poo.PlatonicSolid#getFaces()
   */
  @Override
  public int getFaces()
  {
    return 20;
  }

  /* (non-Javadoc)
   * @see com.ybadoo.tutoriais.poo.PlatonicSolid#getVertices()
   */
  @Override
  public int getVertices()
  {
    return 12;
  }

  /* (non-Javadoc)
   * @see com.ybadoo.tutoriais.poo.PlatonicSolid#area()
   */
  @Override
  public double area()
  {
    return 5.0 * Math.sqrt(3.0) * Math.pow(getLength(), 2.0);
  }

  /* (non-Javadoc)
   * @see com.ybadoo.tutoriais.poo.PlatonicSolid#volume()
   */
  @Override
  public double volume()
  {
    return 5.0 / 12.0 * (3.0 + Math.sqrt(5.0)) * Math.pow(getLength(), 3.0);
  }
}

Arquivo CacheException.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;

/**
 * A generic exception, which indicates a cache error has occurred
 */
public class CacheException extends RuntimeException
{
  /**
   * Identificador de serializacao da classe
   */
  private static final long serialVersionUID = 1L;

  /**
   * Constructs a new cache exception
   */
  public CacheException()
  {
    super();
  }

  /**
   * Constructs a new cache exception based in a exception thrown
   *
   * @param exception a exception thrown
   */
  public CacheException(Exception exception)
  {
    super(exception.getMessage(),exception.getCause());
  }
}

Arquivo PlatonicSolidCache.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;

/**
 * Classe responsavel pela representacao de um cache de solidos platonicos
 *
 * Classe FlyweightFactory do padrao de projetos Flyweight
 */
public class PlatonicSolidCache
{
  /**
   * Cache de solidos platonicos
   */
  private Map<Class<?>, Map<Integer, PlatonicSolid>> cache;

  /**
   * Construtor padrao
   */
  public PlatonicSolidCache()
  {
    cache = new HashMap<Class<?>, Map<Integer, PlatonicSolid>>();
  }

  /**
   * Retornar a instancia solido platonico desejado
   *
   * @param klass classe do solido platonico desejado
   * @param length comprimento da aresta do solido platonico
   * @return instancia do solido platonico
   * @throws CacheException problemas na localizacao da instancia no cache
   */
  public PlatonicSolid lookup(Class<?> klass, Integer length)
    throws CacheException
  {
    if(!cache.containsKey(klass))
    {
      cache.put(klass, new HashMap<Integer, PlatonicSolid>());
    }

    Map<Integer, PlatonicSolid> pool = cache.get(klass);

    if(!pool.containsKey(length))
    {
      try
      {
        pool.put(length, (PlatonicSolid)klass.getConstructors()[0]
                                             .newInstance(length));
      }
      catch(Exception exception)
      {
        throw new CacheException(exception);
      }
    }

    return pool.get(length);
  }

  /**
   * Retornar a instancia solido platonico desejado
   *
   * @param className nome da classe do solido platonico desejado
   * @param length comprimento da aresta do solido platonico
   * @return instancia do solido platonico
   * @throws CacheException problemas na localizacao da instancia no cache
   */
  public PlatonicSolid lookup(String className, Integer length)
    throws CacheException
  {
    try
    {
      return lookup(Class.forName(PlatonicSolid.class.getPackage().getName()
        + "." + className), length);
    }
    catch(CacheException exception)
    {
      throw exception;
    }
    catch(Exception exception)
    {
      throw new CacheException(exception);
    }
  }
}

Arquivo Application.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;

/**
 * Classe responsavel pela execucao do cache de solidos platonicos
 *
 * Classe Client do padrao de projetos Flyweight
 */
public class Application
{
  /**
   * Metodo principal da linguagem de programacao Java
   *
   * @param args argumentos da linha de comando (nao utilizado)
   */
  public static void main(String[] args)
  {
    PlatonicSolidCache cache = new PlatonicSolidCache();

    System.out.println("Tetrahedron Cache");

    System.out.println(cache.lookup(Tetrahedron.class, 5));

    System.out.println(cache.lookup(Tetrahedron.class, 6));

    System.out.println(cache.lookup("Tetrahedron", 5));

    System.out.println();

    System.out.println("Hexahedron Cache");

    System.out.println(cache.lookup("Hexahedron", 5));

    System.out.println(cache.lookup(Hexahedron.class, 6));

    System.out.println(cache.lookup(Hexahedron.class, 5));

    System.out.println();

    System.out.println("Octahedron Cache");

    System.out.println(cache.lookup(Octahedron.class, 5));

    System.out.println(cache.lookup(Octahedron.class, 6));

    System.out.println(cache.lookup(Octahedron.class, 5));

    System.out.println();

    System.out.println("Dodecahedron Cache");

    System.out.println(cache.lookup(Dodecahedron.class, 5));

    System.out.println(cache.lookup(Dodecahedron.class, 6));

    System.out.println(cache.lookup(Dodecahedron.class, 5));

    System.out.println();

    System.out.println("Icosahedron Cache");

    System.out.println(cache.lookup(Icosahedron.class, 5));

    System.out.println(cache.lookup(Icosahedron.class, 6));

    System.out.println(cache.lookup(Icosahedron.class, 5));
  }
}

Saída da solução em Java

Tetrahedron Cache
com.ybadoo.tutoriais.poo.Tetrahedron@43c8308
com.ybadoo.tutoriais.poo.Tetrahedron@20be8464
com.ybadoo.tutoriais.poo.Tetrahedron@43c8308

Hexahedron Cache
com.ybadoo.tutoriais.poo.Hexahedron@1f2f0ce9
com.ybadoo.tutoriais.poo.Hexahedron@49f8a4fd
com.ybadoo.tutoriais.poo.Hexahedron@1f2f0ce9

Octahedron Cache
com.ybadoo.tutoriais.poo.Octahedron@655538e5
com.ybadoo.tutoriais.poo.Octahedron@3e0a765c
com.ybadoo.tutoriais.poo.Octahedron@655538e5

Dodecahedron Cache
com.ybadoo.tutoriais.poo.Dodecahedron@4ec4396a
com.ybadoo.tutoriais.poo.Dodecahedron@3495868c
com.ybadoo.tutoriais.poo.Dodecahedron@4ec4396a

Icosahedron Cache
com.ybadoo.tutoriais.poo.Icosahedron@13f0c45f
com.ybadoo.tutoriais.poo.Icosahedron@23ec4333
com.ybadoo.tutoriais.poo.Icosahedron@13f0c45f