Considere a seguinte classe implementada em PHP.O padrão de projeto (design pattern) que pode ser reconhecido no trecho descrito é denominado
ATemplate Method.
BSingleton.
CBuilder.
DFlyweight.
EDecorator.
Revelar gabarito e comentário▾
GabaritoB — Singleton.
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 (Design Patterns) em PHP
Gabarito: letra B — Singleton. O padrão Singleton garante que uma classe tenha apenas uma única instância em todo o programa e fornece um ponto de acesso global a ela. No trecho de código PHP da questão, a presença de um construtor privado (impedindo a criação direta de objetos com new), de uma propriedade estática privada que armazena a instância e de um método estático público que a retorna (geralmente chamado getInstance()) são as marcas registradas desse padrão.
O padrão Singleton é um dos padrões de projeto mais cobrados em provas de programação, justamente por ter uma implementação muito característica e fácil de reconhecer. Ele pertence à família dos padrões criacionais, que lidam com o processo de criação de objetos. A ideia central é controlar rigorosamente quantas instâncias de uma classe podem existir — no caso do Singleton, exatamente uma. Isso é útil para recursos compartilhados, como conexões de banco de dados, configurações globais ou logs, onde múltiplas instâncias seriam desnecessárias ou até prejudiciais.
A implementação típica em PHP segue uma estrutura quase fixa, que é o que a banca explora para o reconhecimento:
Construtor privado (private function __construct()): impede que o código externo crie objetos diretamente com new MinhaClasse(). Essa é a primeira pista forte.
Propriedade estática privada (private static $instancia): guarda a única instância da classe. O modificador static faz a propriedade pertencer à classe, e não a um objeto específico.
Método estático público (public static function getInstance()): é o ponto de acesso global. Dentro dele, verifica-se se a propriedade estática já foi preenchida; se não, cria-se a instância (chamando o construtor privado internamente) e a armazena; se sim, retorna-se a instância já existente.
Vamos ver como isso funciona na prática com um mini-exemplo conceitual:
class Conexao {
private static $instancia = null;
private function __construct() {
// configuração da conexão
}
public static function getInstance() {
if (self::$instancia === null) {
self::$instancia = new self();
}
return self::$instancia;
}
}
$conexao1 = Conexao::getInstance();
$conexao2 = Conexao::getInstance();
// $conexao1 e $conexao2 são o MESMO objeto
Aqui, tanto $conexao1 quanto $conexao2 apontam para o mesmo objeto na memória. Se você tentar new Conexao(), um erro fatal será lançado porque o construtor é privado. É exatamente essa estrutura — construtor privado + propriedade estática + método estático de acesso — que a questão apresenta na imagem.
A distinção que importa aqui é entre o Singleton e os outros padrões listados nas alternativas. O Template Method define o esqueleto de um algoritmo em um método, deixando que subclasses implementem passos específicos — envolve herança e métodos abstratos. O Builder separa a construção de um objeto complexo de sua representação, permitindo criar diferentes variações passo a passo — envolve um diretor e um construtor com métodos como setParteA(), setParteB(), build(). O Flyweight é um padrão estrutural que compartilha objetos para economizar memória quando há muitas instâncias semelhantes — envolve um pool de objetos e um método getFlyweight($chave). O Decorator adiciona responsabilidades a um objeto dinamicamente, envolvendo-o em classes que implementam a mesma interface — envolve composição e uma cadeia de wrappers.
A pegadinha que a banca explora é justamente a semelhança superficial entre o Singleton e o Flyweight: ambos têm um método estático que retorna um objeto e ambos controlam a criação de instâncias. Mas a intenção é oposta: o Singleton garante uma única instância para todo o programa, enquanto o Flyweight gerencia muitas instâncias compartilhadas de tipos diferentes, identificadas por uma chave. O candidato que vê getInstance() e pensa em Flyweight cai na armadilha.
Guarde a estrutura de reconhecimento: construtor privado + propriedade estática privada + método estático público que retorna a instância = Singleton. É esse trio que vai separar a alternativa correta das demais.
Padrões de projeto
1Criacionais
Singleton
construtor privado
propriedade estática única
getInstance() retorna a mesma instância
Builder
construção passo a passo
métodos setParteA/setParteB/build
2Estruturais
Flyweight
pool de instâncias
chaves identificam objetos
Decorator
wrappers que adicionam comportamento
composição e delegação
3Comportamentais
Template Method
esqueleto de algoritmo
subclasses preenchem passos
LEVEL · soulevel.com.br
Alternativa A — ❌ Incorreta
O Template Method define o esqueleto de um algoritmo em uma operação, postergando alguns passos para as subclasses. Ele é implementado com um método que chama métodos abstratos ou métodos com implementação padrão, que as subclasses podem sobrescrever. No trecho da questão não há herança, nem métodos abstratos, nem um algoritmo com passos a serem preenchidos — há apenas o controle de uma única instância. A confusão aqui seria ver um método estático e associá-lo a um "molde" de algoritmo, mas o Template Method não tem relação com controle de instância.
Alternativa B — ✅ Correta ⟵ GABARITO
O Singleton é o padrão que garante a existência de uma única instância de uma classe, com um ponto de acesso global. A implementação em PHP é caracterizada por: construtor privado (impede new), propriedade estática privada que guarda a instância e método estático público (tipicamente getInstance()) que cria a instância na primeira chamada e a retorna nas chamadas seguintes. O trecho da questão apresenta exatamente essa estrutura, com a verificação de nulidade da propriedade estática antes de criar o objeto — a assinatura clássica do Singleton.
Alternativa C — ❌ Incorreta
O Builder é um padrão criacional que separa a construção de um objeto complexo de sua representação, permitindo que o mesmo processo de construção crie representações diferentes. Ele envolve um diretor que orquestra um builder com métodos como setParteA(), setParteB() e um método build() que retorna o objeto final. No trecho da questão não há construção passo a passo, nem métodos de configuração de partes, nem um diretor — há apenas o controle de instância única. A confusão seria associar o método estático a um "construtor", mas o Builder não tem relação com controle de instância.
Alternativa D — ❌ Incorreta
O Flyweight é um padrão estrutural que usa compartilhamento para suportar grandes quantidades de objetos de granularidade fina de forma eficiente. Ele mantém um pool de objetos já criados e retorna um existente quando a chave solicitada já está no pool, criando um novo apenas se necessário. Embora tenha um método estático que retorna um objeto (semelhante ao Singleton), a diferença crucial é que o Flyweight gerencia muitas instâncias diferentes identificadas por chaves, enquanto o Singleton garante uma única instância para todo o programa. No trecho da questão, a propriedade estática guarda uma única instância, sem chaves ou pool — portanto, é Singleton, não Flyweight. Essa é a pegadinha mais comum da banca.
Alternativa E — ❌ Incorreta
O Decorator é um padrão estrutural que permite adicionar responsabilidades a um objeto dinamicamente, envolvendo-o em objetos que implementam a mesma interface. Ele é implementado com uma classe que recebe um objeto da mesma interface em seu construtor e delega chamadas, adicionando comportamento antes ou depois. No trecho da questão não há composição, nem wrappers, nem delegação de chamadas — há apenas o controle de instância única. A confusão seria ver um método estático e associá-lo a um "invólucro", mas o Decorator não tem relação com controle de instância.
NÃO CAIA NESSA!
A banca adora trocar o Singleton pelo Flyweight, porque ambos têm um método estático que retorna um objeto. A diferença está na intenção: o Singleton garante uma única instância para todo o programa (propriedade estática única, sem chaves), enquanto o Flyweight gerencia muitas instâncias compartilhadas identificadas por chaves em um pool. Quando você vir getInstance() com uma propriedade estática única e construtor privado, é Singleton — não caia na tentação de pensar em Flyweight só porque existe um método estático. Com treino, você reconhece essa estrutura de longe 💪
PEGA ESSA DICA!
Para reconhecer padrões de projeto em provas, monte um mapa mental com as três famílias: criacionais (Singleton, Builder, Factory Method, Abstract Factory, Prototype) — lidam com a criação de objetos; estruturais (Adapter, Decorator, Facade, Flyweight, Proxy, Composite, Bridge) — lidam com a composição de classes e objetos; comportamentais (Strategy, Observer, Template Method, Command, State, Iterator, Chain of Responsibility) — lidam com a distribuição de responsabilidades e comunicação entre objetos. Na hora da prova, primeiro identifique a família pelo problema que o código resolve; isso já elimina metade das alternativas antes de você analisar o padrão específico.