Lista de Exercícios 006 - Prototype
Exercício 1: Situações para análise
Seção intitulada “Exercício 1: Situações para análise”Para cada situação abaixo, indique se o uso do padrão Prototype é adequado ou não, e justifique brevemente sua resposta.
- 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.
- 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.
- 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.
- 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.
- 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.
Exercício 2: Código com problema
Seção intitulada “Exercício 2: Código com problema”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); }}Exercício 3: Múltipla escolha
Seção intitulada “Exercício 3: Múltipla escolha”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.
Exercício 4: Implementação simples
Seção intitulada “Exercício 4: Implementação simples”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
Cursocom, no mínimo, os atributos:nome,cargaHorariaeplanoAvaliacao(pode ser uma lista de strings, por exemplo); - implemente na classe
Cursoum método de clonagem que crie uma cópia independente, garantindo que modificações noplanoAvaliacaode uma turma não afetem o curso base; - demonstre, em um método
mainou 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.