Pular para o conteúdo principal

Questão de Engenharia de Software — Padrões de Projeto (Engenharia de Software) — FGV 2025

Engenharia de SoftwarePadrões de Projeto (Engenharia de Software)
Código
fg169117
Banca
FGV
Órgão
TCE RR
Ano
2025
Cargo
AAD (TCE-RR)
Um bom desenvolvedor de sistemas deve ter conhecimento sobre refatoração, padrões de arquitetura e de projeto, princípios SOLID e outros tópicos importantes sobre programação.   Em relação a padrões de projeto, considere o seguinte trecho de código:   public interface Heroi {     void falar(); } public class HomemDeFerro implements Heroi {     public void falar() {         System.out.println("Eu sou o Homem de Ferro, da Marvel!");     } } public class SuperHomem implements Heroi {     public void falar() {         System.out.println("Eu sou o Super Homem, da DC!");     } } public class MarvelOuDC {     public static Heroi getHeroi(String nome) {         if (nome.equalsIgnoreCase("HomemDeFerro")) {             return new HomemDeFerro();         } else if (nome.equalsIgnoreCase("SuperHomem")) {             return new SuperHomem();         }     } }   Marque a opção que corresponde ao padrão de projeto implementado no código acima.
  1. ASingleton
  2. BFactory
  3. CObserver
  4. DFlyweight
  5. EBuilder
Revelar gabarito e comentário

GabaritoB — Factory

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

Padrões de Projeto: Factory Method

Gabarito: letra B. O código implementa o padrão Factory Method (ou Fábrica), pois a classe MarvelOuDC possui um método estático getHeroi(String nome) que encapsula a lógica de criação de objetos Heroi, decidindo qual classe concreta (HomemDeFerro ou SuperHomem) instanciar com base em um parâmetro — exatamente o papel de uma fábrica. O padrão é identificado pela presença de um método cuja responsabilidade é criar objetos de uma hierarquia, retornando o tipo abstrato (interface Heroi) e escondendo do cliente qual implementação concreta foi instanciada.

O padrão Factory Method é um dos padrões criacionais do catálogo GoF (Gang of Four), que trata de problemas relacionados à criação de objetos. A ideia central é desacoplar o cliente da classe concreta: em vez de o cliente usar new HomemDeFerro() diretamente, ele chama um método que decide, internamente, qual objeto criar. Isso traz benefícios como:

  • Flexibilidade: a lógica de criação fica centralizada, facilitando a adição de novos tipos de herói sem alterar o código do cliente.

  • Reutilização: o mesmo método de fábrica pode ser usado em vários pontos do sistema.

  • Manutenção: mudanças na forma de criar objetos afetam apenas a fábrica.

No código apresentado, a interface Heroi define o contrato (falar()), as classes HomemDeFerro e SuperHomem implementam esse contrato, e a classe MarvelOuDC atua como a fábrica, com o método getHeroi que recebe um nome e retorna a instância apropriada. O cliente que chama MarvelOuDC.getHeroi("HomemDeFerro") recebe um objeto Heroi sem precisar saber qual classe concreta foi instanciada.

É importante distinguir o Factory Method de outros padrões criacionais:

Critério

Factory Method

Abstract Factory

Singleton

Builder

Objetivo

Criar um objeto de uma hierarquia

Criar famílias de objetos relacionados

Garantir uma única instância

Construir objetos complexos passo a passo

Estrutura

Um método de fábrica

Uma interface de fábrica com múltiplos métodos

Um método estático que retorna a instância única

Um diretor que orquestra a construção

Retorno

Um tipo abstrato

Um tipo abstrato de uma família

A própria classe

O objeto construído

Exemplo no código

getHeroi() retorna Heroi

Não presente

Não presente

Não presente

A pegadinha da banca está em confundir o Factory Method com o Singleton. No Singleton, o método de acesso (geralmente getInstance()) retorna sempre a mesma instância da própria classe, garantindo que exista apenas um objeto. No código da questão, o método getHeroi cria uma nova instância a cada chamada (return new HomemDeFerro()), o que descarta o Singleton. Além disso, o retorno é uma interface (Heroi), não a própria classe da fábrica.

Outros padrões citados nas alternativas também não se aplicam:

  • Observer: é um padrão comportamental que define uma dependência um-para-muitos entre objetos, para que quando um objeto mude de estado, todos os seus dependentes sejam notificados. Não há notificação nem dependência no código.

  • Flyweight: é um padrão estrutural que visa economizar memória compartilhando objetos comuns. O código cria objetos novos a cada chamada, sem compartilhamento.

  • Builder: é um padrão criacional que separa a construção de um objeto complexo da sua representação, permitindo o mesmo processo de construção criar diferentes representações. O código não constrói objetos passo a passo.

Guarde a fronteira entre criar um objeto (Factory Method) e garantir uma única instância (Singleton): é exatamente nela que as alternativas se dividem.

Alternativa A — ❌ Incorreta

O Singleton garante que uma classe tenha apenas uma instância e fornece um ponto global de acesso a ela. No código, o método getHeroi cria uma nova instância a cada chamada (return new HomemDeFerro()), o que contraria o princípio do Singleton. Além disso, o Singleton normalmente retorna a própria classe, não uma interface.

Alternativa B — ✅ Correta ⟵ GABARITO

O padrão Factory Method é implementado pela classe MarvelOuDC, cujo método getHeroi encapsula a criação de objetos Heroi, decidindo qual classe concreta instanciar com base no parâmetro nome. Isso caracteriza uma fábrica: o cliente não precisa conhecer as classes concretas, apenas a interface Heroi.

Alternativa C — ❌ Incorreta

O Observer é um padrão comportamental que define uma dependência um-para-muitos, onde quando um objeto muda de estado, todos os seus dependentes são notificados automaticamente. No código, não há notificação, nem lista de observadores, nem mudança de estado — apenas criação de objetos.

Alternativa D — ❌ Incorreta

O Flyweight é um padrão estrutural que visa reduzir o uso de memória compartilhando objetos comuns entre múltiplos contextos. No código, cada chamada a getHeroi cria um novo objeto (new HomemDeFerro()), sem qualquer compartilhamento ou reutilização de instâncias.

Alternativa E — ❌ Incorreta

O Builder é um padrão criacional que separa a construção de um objeto complexo da sua representação, permitindo que o mesmo processo de construção crie diferentes representações. No código, a criação é simples e direta (new HomemDeFerro()), sem etapas de construção ou diretor.

Gabarito: letra B

Link permanente: /questoes/fg169117