Questão de Engenharia de Software — Padrões de Projeto (Engenharia de Software) — FGV 2025
- Código
- fg169117
- Banca
- FGV
- Órgão
- TCE RR
- Ano
- 2025
- Cargo
- AAD (TCE-RR)
- ASingleton
- BFactory
- CObserver
- DFlyweight
- EBuilder
GabaritoB — Factory
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 |
| 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.
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.
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.
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.
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.
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