Pular para o conteúdo

Lista de Exercícios 006 - Prototype

Para cada situação abaixo, indique se o uso do padrão Prototype é adequado ou não, e justifique brevemente sua resposta.

  1. Situação 1: Em um jogo de RPG online, o servidor precisa criar centenas de inimigos com combinações semelhantes de atributos (vida, dano, habilidades) a partir de alguns modelos base, minimizando o custo de configuração de cada inimigo.
  2. Situação 2: Em um pequeno script utilitário, é criada apenas uma instância de uma classe de configuração simples com três campos primitivos, e não há necessidade de duplicá-la em momento algum.
  3. Situação 3: Um sistema acadêmico possui “modelos de plano de ensino” por curso. A cada semestre, novas turmas devem ser criadas copiando o plano de ensino base e permitindo ajustes locais sem afetar o modelo original.
  4. Situação 4: Uma API REST recebe requisições com JSON e, para cada requisição, instancia objetos diretamente a partir dos dados recebidos, sem reutilizar nenhum estado pré-configurado.
  5. Situação 5: Um construtor visual de telas web permite definir um layout base de dashboard e, a partir dele, gerar rapidamente versões alterando apenas alguns widgets e filtros, mantendo o restante igual.

Leia o código a seguir, que tenta aplicar o padrão Prototype em um contexto de jogo. Identifique o principal problema relacionado ao uso incorreto do Prototype e descreva, em alto nível, como você melhoraria essa implementação.

class Arma {
String nome;
}
class InimigoPrototype {
String tipo;
int vida;
List<Arma> armas;
public InimigoPrototype(String tipo, int vida, List<Arma> armas) {
this.tipo = tipo;
this.vida = vida;
this.armas = armas;
}
// Método de "clone" simplificado
public InimigoPrototype clonar() {
// apenas reutiliza a mesma lista de armas
return new InimigoPrototype(this.tipo, this.vida, this.armas);
}
}
public class JogoApp {
public static void main(String[] args) {
List<Arma> armasBase = new ArrayList<>();
armasBase.add(new Arma());
armasBase.get(0).nome = "Espada básica";
InimigoPrototype goblinBase = new InimigoPrototype("Goblin", 50, armasBase);
InimigoPrototype goblinElite = goblinBase.clonar();
// altera armas do goblinElite
goblinElite.armas.get(0).nome = "Espada envenenada";
System.out.println("Goblin base: " + goblinBase.armas.get(0).nome);
System.out.println("Goblin elite: " + goblinElite.armas.get(0).nome);
}
}

Considere um sistema de gerenciamento de cursos online que mantém “modelos de curso” já configurados (carga horária, plano de avaliação e estrutura de módulos). A cada novo semestre, a plataforma cria turmas a partir desses modelos. Qual alternativa descreve de forma mais adequada o uso do padrão Prototype nesse cenário?

A) Usar o Prototype apenas para criar objetos imutáveis de configuração global, já que turmas nunca devem sofrer alterações após criadas.
B) Usar o Prototype para clonar os modelos de curso, permitindo que cada turma criada seja uma cópia independente que possa sofrer ajustes sem impactar o modelo original.
C) Evitar o Prototype e sempre reconstruir os cursos do zero com new, para garantir que nenhum estado seja compartilhado entre turmas.
D) Usar o Prototype somente para copiar listas de alunos, pois são a parte mais volátil do sistema, ignorando os modelos de curso. E) Usar o Prototype para criar uma única instância de curso e compartilhar essa instância entre todas as turmas, já que elas são essencialmente iguais.

Em um sistema acadêmico, você deve implementar um mecanismo simples para criar turmas a partir de um curso modelo usando o padrão Prototype. A ideia é que exista um “curso base” configurado uma única vez, e que novas turmas sejam geradas por cópia desse curso.

Implemente uma solução simples que:

  • defina uma interface ou método de clonagem para representar o Prototype de curso;
  • tenha uma classe Curso com, no mínimo, os atributos: nome, cargaHoraria e planoAvaliacao (pode ser uma lista de strings, por exemplo);
  • implemente na classe Curso um método de clonagem que crie uma cópia independente, garantindo que modificações no planoAvaliacao de uma turma não afetem o curso base;
  • demonstre, em um método main ou equivalente, a criação de um curso base e de pelo menos duas turmas clonadas, alterando algum detalhe em cada turmas.

Dica: você pode usar a linguagem de programação que está sendo utilizada na disciplina, preferencialmente Java.