Padrões de projeto em Java: escolha o problema do seu código e receba o padrão em um arquivo Java curto que roda

Os 23 padrões GoF em Java: escolha a situação do seu código, veja o padrão em um arquivo Java 21 curto e a saída real.

Padrões de projeto em Java: escolha o problema do seu código e receba o padrão em um arquivo Java curto que roda
Exemplo do resultado que esta página entrega

Experimentar grátis

Como funciona
  1. Preencha os seus dados na versão grátis abaixo.
  2. Veja o resultado na hora, nesta página.
  3. Precisa de mais? A versão completa acrescenta o que está em «O que você recebe».

O que você recebe: Versão completa →

ReadyStack

Padrões de projeto em Java · os 23 padrões GoF

  • Os 23 padrões, um arquivo curto cada. Cada padrão GoF é um arquivo Java 21 de 22 a 56 linhas (mediana de 32), com records, tipos sealed e pattern matching: sem código repetitivo de getters.
  • Todos os 34 testes passam no Java 21 e no Java 25. Descompacte e rode mvn test: 23 classes de teste JUnit 5, 0 falhas. A saída abaixo de cada exemplo é a saída real daquele arquivo.
  • Pague uma vez, sem assinatura. Leia todos os padrões aqui de graça. O kit completo (projeto Maven, PDF de 30 páginas, 69 exercícios, regras para IA) é uma compra única.

Kit completo $19, pagamento único · código e explicações em inglês · Versão gratuita ou kit completo?

Quando usar cada padrão de projeto

Encontre a frase que corresponde ao seu código e clique no padrão.

Seu código tem esta situaçãoPadrãoNÃO use quandoLinhas
Criacionais
Um objeto compartilhado, e uma segunda cópia seria um problemaNão serve para coisas que você precisa trocar em testes (um banco de dados, um relógio): receba-as por parâmetro.22
Uma classe base executa os passos, e as subclasses escolhem qual objeto ela criaNão quando há só uma classe de produto: um construtor ou um método fábrica estático basta.32
Vários objetos precisam vir da mesma família (região, tema, banco de dados)Não quando há um só tipo de produto, ou quando as famílias nunca se misturam: ele adiciona classes à toa.29
Muitos campos opcionais, ou o objeto precisa estar válido antes de alguém vê-loNão para um record com 2-3 campos todos obrigatórios: o construtor canônico é mais claro.37
Novos objetos começam como cópia de um modelo configuradoNão quando os objetos são baratos de construir; e cuidado com cópias rasas de campos mutáveis.28
Estruturais
Uma classe que você não pode editar tem a interface erradaNão quando você controla os dois lados: altere a interface em vez de criar um tradutor.28
Duas coisas variam de forma independente e as subclasses se multiplicam (tipo x canal)Não quando uma das duas dimensões tem só uma variante.31
Uma árvore em que um item e um grupo de itens devem ser usados da mesma formaNão quando seus dados são planos, ou quando itens isolados e grupos precisam de operações muito diferentes.25
Acrescentar comportamentos opcionais em qualquer combinação em tempo de execuçãoNão quando a ordem dos extras não pode importar: os invólucros são aplicados em ordem de pilha.30
Quem chama repete a mesma sequência de vários passos em várias classesNão como lugar para esconder toda a lógica: a fachada coordena, não deve virar uma classe-deus.46
Milhares de objetos repetem os mesmos dados pesadosNão quando os objetos são poucos ou a parte compartilhada é pequena: você adiciona uma fábrica com pouco ganho.32
Controlar o acesso a um objeto lento, remoto ou protegido sem alterar quem o chamaNão quando a camada extra esconde falhas que quem chama precisa tratar (erros de rede atrás de uma interface 'local').33
Comportamentais
Uma requisição passa por uma cadeia de manipuladores até que um deles a trateNão quando sempre se aplica exatamente um manipulador fixo: uma chamada direta é mais clara e mais fácil de depurar.26
Ações precisam ser enfileiradas, registradas, repetidas ou desfeitasNão para chamadas pontuais que você nunca enfileira ou desfaz: é burocracia a mais.44
Usuários escrevem regras ou fórmulas em uma pequena linguagem que você precisa interpretarNão para linguagens grandes ou que mudam rápido: use um gerador de parser (ANTLR) ou um motor de expressões existente.56
Percorrer itens sem saber como eles são armazenadosNão quando um Stream ou uma coleção existente já oferece o que você precisa.30
Muitos objetos se comunicam entre si e as referências se emaranhamNão quando o mediador vira um objeto-deus que concentra toda a lógica.37
Salvar e restaurar o estado de um objeto sem expor seus camposNão quando as capturas são grandes e frequentes: guarde as mudanças (comandos) no lugar.36
Quando um objeto muda, outros precisam reagirNão quando a reação precisa acontecer em ordem estrita ou em uma só transação: chame diretamente.30
O comportamento depende de um status, e cada método testa esse status com condicionaisNão para dois ou três estados com regras simples: um enum com um switch resolve bem.42
Várias formas intercambiáveis de fazer o mesmo trabalho, escolhidas em tempo de execuçãoNão quando existe um único algoritmo que nunca muda.24
Os mesmos passos na mesma ordem, mas só alguns passos mudamNão quando os passos variam livremente: passe uma Estratégia em vez de forçar herança.34
Novas operações sobre um conjunto fixo de tipos, sem editar os tiposNão quando o conjunto de tipos muda com frequência: cada novo tipo obriga a editar todos os visitantes.52

Perguntas de entrevista sobre padrões de projeto (69, com respostas curtas)

Três por padrão. Responda em voz alta primeiro e só então abra a resposta.

Singleton 3 perguntas
Por que um enum é o Singleton mais seguro em Java?
A JVM cria a constante uma só vez, com segurança para threads, e a serialização e a reflexão de enums não conseguem criar uma segunda instância.
O que há de errado na inicialização preguiçosa que verifica `instance == null` sem sincronização?
Duas threads podem ver null e criar duas instâncias; é preciso uma classe auxiliar de inicialização sob demanda, um enum, ou dupla checagem com sincronização em um campo volatile.
Por que as pessoas chamam o Singleton de anti-padrão?
É um estado global escondido: quem chama depende dele sem dizer, e os testes não conseguem substituí-lo. Prefira receber o objeto por parâmetro (injeção de dependência).
Método Fábrica 3 perguntas
Método Fábrica versus método de fábrica estático como List.of()?
O Método Fábrica do GoF é um método de instância sobrescrevível, que as subclasses alteram; um método fábrica estático é um método fixo que esconde o construtor.
Método Fábrica versus Fábrica Abstrata?
O Método Fábrica cria um produto por herança; a Fábrica Abstrata é um objeto que cria uma família inteira de produtos relacionados.
Qual princípio SOLID ele apoia?
Aberto/Fechado: um novo canal é uma nova subclasse, e o código existente de notify() não é editado.
Fábrica Abstrata 3 perguntas
Qual é o ponto fraco da Fábrica Abstrata?
Adicionar um novo tipo de produto significa acrescentar um método à interface e a cada fábrica.
Como você escolhe qual fábrica concreta usar?
Uma vez, na inicialização (configuração ou injeção de dependência); o resto do código só enxerga a interface.
Dá para construir uma Fábrica Abstrata a partir de Métodos Fábrica?
Sim: cada método create da fábrica costuma ser um método fábrica que as subclasses implementam.
Construtor 3 perguntas
Por que não usar apenas setters?
Setters deixam visível um objeto mutável e pela metade; um construtor entrega o objeto só depois que build() o validou.
Onde você valida em um Construtor?
No build() para regras entre campos (um pedido precisa de um item), e no construtor compacto do record para regras que valem sempre.
Construtor versus records com métodos `with`?
Records são ótimos para valores pequenos e imutáveis; um Construtor ainda vence quando há muitas partes opcionais ou uma montagem passo a passo.
Protótipo 3 perguntas
Cópia rasa versus cópia profunda?
A cópia rasa compartilha os objetos internos (a mesma lista); a cópia profunda copia esses objetos também, então mudanças na cópia nunca chegam ao original.
Por que muitas equipes evitam Cloneable?
clone() ignora construtores, retorna Object, lança uma exceção verificada e copia de forma rasa por padrão; um copy() explícito ou um construtor de cópia é mais claro.
O que é um catálogo de protótipos?
Um mapa de objetos prontos com nome (modelos) que quem chama copia em vez de construir do zero.
Adaptador 3 perguntas
Adaptador versus Fachada?
O Adaptador faz uma interface existente encaixar em outra; a Fachada cria uma interface nova e mais simples sobre várias classes.
Adaptador de objeto versus adaptador de classe?
Um adaptador de objeto guarda o objeto antigo (composição, o padrão em Java); um adaptador de classe herda dele, o que em Java só é permitido para uma única classe.
Adaptador versus Decorador?
O Adaptador muda a interface e mantém o comportamento; o Decorador mantém a interface e acrescenta comportamento.
Ponte 3 perguntas
Quantas classes você precisa para M tipos e N canais?
Com Bridge, M + N classes; com subclasses, uma para cada combinação M x N.
Bridge ou Adapter?
O Bridge é planejado de antemão para que os dois lados possam evoluir separadamente; o Adapter é acrescentado depois para fazer coisas já existentes se encaixarem.
Bridge ou Strategy?
O código parece parecido (um objeto guarda uma interface); o Bridge divide uma estrutura em duas para o longo prazo, o Strategy troca um algoritmo.
Composto 3 perguntas
Onde ficam os métodos de gerenciamento de filhos (add/remove)?
Ou só no grupo (com tipagem segura) ou na interface comum (uniforme, mas as folhas precisam recusar); explique a troca que você faz.
Como uma sealed interface ajuda um Composite?
O compilador sabe que os únicos tipos são Product e Bundle, então o switch sobre eles é verificado para cobrir todos os casos.
Cite um risco dos Composites profundos.
Profundidade de recursão e ciclos: um Bundle que contém a si mesmo entra em loop infinito, a menos que você se proteja disso.
Decorador 3 perguntas
Decorator ou herança?
A herança fixa os extras em tempo de compilação; os decorators os combinam em tempo de execução, sem novas classes.
Decorator ou Proxy?
Mesma forma; um Decorator adiciona um comportamento que quem chama pediu, enquanto um Proxy controla o acesso (cache, carregamento preguiçoso, segurança) ao mesmo objeto.
A ordem dos wrappers importa?
Sim. Em um item de 1000 centavos neste kit: cupom e depois express = 1899, express e depois cupom = 1800 (ambos testados).
Fachada 3 perguntas
Uma Facade impede quem chama de usar os subsistemas?
Não. Ela oferece um caminho simples; quem precisa de mais controle pode continuar usando as partes diretamente.
Facade ou Mediator?
A Facade é de mão única: os clientes a chamam e ela chama as partes. O Mediator é de mão dupla: as partes conversam entre si por meio dele.
Que bug a Facade deste kit impede?
Um pagamento recusado liberando o estoque reservado: o teste verifica que sobra 1 luminária após a recusa.
Peso-Mosca 3 perguntas
O que precisa ser verdade sobre a parte compartilhada (intrínseca)?
Ela precisa ser imutável, porque todos os usuários veem o mesmo objeto.
Por que `Integer a = 127, b = 127; a == b` pode dar true, mas false para 128?
O Integer.valueOf guarda em cache os valores de -128..127 (um pool de flyweights), então 127 é o mesmo objeto; 128 é um novo. Compare com equals().
Flyweight ou Singleton?
Singleton é uma única instância de uma classe; Flyweight é um pool de instâncias compartilhadas, uma por valor distinto.
Proxy 3 perguntas
Cite quatro tipos de proxy.
Virtual (criação preguiçosa), remoto (representa um objeto em outro lugar), de proteção (verificações de acesso), de cache ou referência inteligente.
Como o @Transactional do Spring usa esse padrão?
O Spring envolve o bean em um proxy que abre e confirma a transação em volta da chamada ao método real.
Por que uma chamada feita de dentro da própria classe ignora o @Transactional?
this.method() chama o objeto real diretamente, e não o proxy, então o trabalho extra do proxy nunca é executado.
Cadeia de Responsabilidade 3 perguntas
O que acontece se nenhum manipulador tratar a requisição?
Você precisa decidir: um valor padrão (aqui 'board review'), uma exceção ou um Optional vazio. Nunca falhe em silêncio.
Chain ou Decorator?
Um decorator sempre chama o objeto envolvido; um manipulador em uma cadeia pode interromper a requisição e não repassá-la.
Como o Java 8+ deixa as cadeias curtas?
Os manipuladores podem ser lambdas que retornam Optional, encadeados com um método default como then(), como neste kit.
Comando 3 perguntas
Como implementar o desfazer com Command?
Empilhe cada comando executado em uma pilha; o desfazer remove o último e chama o seu undo(), que restaura o que execute() alterou.
Command ou Strategy?
Um Strategy é COMO fazer um trabalho (uma ordem de classificação); um Command é um pedido para fazer algo, muitas vezes com dados próprios e a possibilidade de desfazer.
Por que o Clear guarda o texto antigo?
Limpar destrói informação; o desfazer precisa do valor 'antes', então o comando o guarda (um pequeno memento).
Interpretador 3 perguntas
O que são expressões terminais e não terminais?
Terminais são as folhas (números, nomes de variáveis); não terminais combinam outras expressões (Add, Mul).
Como o Java 21 encurta um interpretador?
Uma sealed interface de records para a gramática e um único switch com record patterns para o eval; o compilador verifica se todos os casos são tratados.
Onde fica a precedência dos operadores?
Na gramática do analisador sintático: product é analisado dentro de sum, então '2 + 3 * 4' vira Add(2, Mul(3, 4)) = 14.
Iterador 3 perguntas
O que é um iterador fail-fast?
O iterador do ArrayList lança ConcurrentModificationException se a lista for alterada durante a iteração, exceto pelo próprio iterador.
O que o next() deve fazer no fim?
Lançar NoSuchElementException, como diz o contrato de Iterator (testado neste kit).
Iteração interna ou externa?
Externa: quem chama puxa os itens com next(). Interna: a coleção envia os itens para a sua lambda (forEach, streams).
Mediador 3 perguntas
Mediator ou Observer?
O Observer transmite as mudanças de um sujeito para os assinantes; o Mediator centraliza a comunicação de mão dupla entre pares.
Principal risco de um Mediator?
Toda a lógica de coordenação vai para uma única classe, que pode ficar enorme; divida-a por caso de uso.
Dê um exemplo de Mediator do mundo real.
Uma torre de controle de aeroporto: os aviões falam com a torre, não entre si.
Memento 3 perguntas
Quais são os três papéis?
Originator (o carrinho, cria e lê os instantâneos), Memento (o instantâneo), Caretaker (o histórico, que só os armazena).
Por que o instantâneo precisa copiar a lista?
Senão, mudanças posteriores no carrinho também alteram o estado 'salvo'; List.copyOf o torna imutável (testado).
Memento ou Command para desfazer?
Memento guarda estados inteiros (simples, mais memória); Command guarda como reverter cada mudança (menos memória, mais código).
Observador 3 perguntas
Que vazamento de memória o Observer causa?
O sujeito mantém referências fortes aos ouvintes; se eles nunca cancelarem a inscrição, nunca poderão ser coletados pelo garbage collector (ouvinte esquecido).
Modelo de envio ou de consulta?
No envio, os dados novos vão junto com o evento (aqui, o Status); na consulta, só se avisa 'mudou' e os ouvintes perguntam ao sujeito.
Por que a classe java.util.Observable foi descontinuada?
É uma classe, não uma interface (você precisa estendê-la), não é serializável e seus eventos são pouco definidos.
Estado 3 perguntas
State ou Strategy?
Mesma forma; no State, os estados se substituem conforme o objeto avança; no Strategy, quem chama escolhe um algoritmo.
Quem decide o próximo estado?
Aqui cada estado devolve o próximo (New.pay() retorna Paid). A outra opção é o contexto decidir; diga qual você escolheu.
Por que usar uma sealed interface para os estados?
O compilador conhece todos os estados, então um switch sobre eles é verificado e ninguém adiciona um estado fora do arquivo.
Estratégia 3 perguntas
Como as lambdas mudam o Strategy?
Um Strategy costuma ser uma interface funcional, então cada algoritmo vira uma lambda de uma linha, em vez de uma classe.
Strategy ou Template Method?
O Strategy troca um algoritmo inteiro por composição em tempo de execução; o Template Method fixa os passos e deixa as subclasses preencherem alguns.
De onde vêm as estratégias em tempo de execução?
Um mapa por nome (como neste kit), configuração ou injeção de dependências.
Método Template 3 perguntas
Por que tornar o método template final?
Assim, nenhuma subclasse pode mudar a ordem dos passos; ela só pode preencher os passos que recebe.
O que é um gancho (hook)?
Um passo opcional com um valor padrão (footer() retorna "" aqui) que as subclasses podem sobrescrever.
Qual princípio o Template Method ilustra?
O princípio de Hollywood: não nos ligue, nós ligamos para você; a classe base chama os passos das subclasses.
Visitante 3 perguntas
O que é double dispatch (despacho duplo)?
O método executado depende de dois tipos em tempo de execução: item.accept(v) escolhe o tipo do item, depois v.visitBook(this) escolhe o visitante.
O que o Java 21 muda no Visitor?
Com tipos sealed e pattern matching, um switch sobre o tipo do item é verificado para cobrir todos os casos e, muitas vezes, substitui as classes visitantes.
Quando o Visitor não é uma boa escolha?
Quando você adiciona tipos com mais frequência do que operações: cada novo tipo força uma mudança em todos os visitantes.

Grátis aqui, ou leve o kit completo com você

Grátis nesta página

  • Todos os 23 padrões: problema, ideia, quando não usar e o cheiro de código que ele substitui
  • O arquivo Java completo de cada padrão e a saída real dele
  • Tabela de quando usar e 69 perguntas de entrevista com respostas

Dúvidas

Qual versão do Java eu preciso?

Java 21 ou mais novo. Todos os arquivos foram compilados com -Xlint:all -Werror e executados no JDK 21 e no JDK 25 com a mesma saída. O run-all.sh avisa se o seu Java for mais antigo.

Preciso do Maven?

Não. O run-all.sh / run-all.cmd compilam com o javac e executam todos os 23 exemplos, e qualquer arquivo isolado roda com java File.java. O Maven serve só para os testes JUnit (mvn test).

Qual IDE usar?

Qualquer uma: abra a pasta como projeto Maven no IntelliJ IDEA, Eclipse ou VS Code; cada exemplo tem um método main.

Posso usar o código no trabalho?

Sim, copie para os seus próprios projetos. Por favor, não revenda o próprio kit.

Mais ferramentas para desenvolvedores e estudantes

Ver todas as ferramentas

Enviar este resultado por e-mail
Uma cópia do que você vê acima, na sua caixa de entrada — a ferramenta continua grátis, nada aqui é bloqueado.

Mais ferramentas para o mesmo trabalho

Padrões de projeto em Java: escolha o problema do seu código e receba o padrão em um arquivo Java curto que rodaCortador de vídeo com IA para Shorts, sem créditosCortador de vídeo com IA para Shorts sem créditos: os melhores cortes 9:16 ranqueados, nada é enviadoVersão gratuitaPadrões de projeto em Java: escolha o problema do seu código e receba o padrão em um arquivo Java curto que rodaLongday Code ThemeCada cor passa em 3 superfíciesVersão gratuita
Pessoas como você também usam
Tudo para desenvolvedores e equipes de conformidade → · ReadyStack Pass — todas as ferramentas em uma só assinatura · Todas as ferramentas →

Perguntas frequentes

O que esta página faz?

Os 23 padrões GoF em Java: escolha a situação do seu código, veja o padrão em um arquivo Java 21 curto e a saída real.

É grátis?

Sim. A versão grátis desta página funciona sem conta.

Como usar?

1. Preencha os seus dados na versão grátis abaixo. 2. Veja o resultado na hora, nesta página. 3. Precisa de mais? A versão completa acrescenta o que está em «O que você recebe».

Pergunte sobre esta ferramenta

Uma pergunta, respondida por quem a construiu. Email só se quiser a resposta por correio.

Para equipes e empresas: para uma fatura com os dados da empresa, um orçamento ou várias licenças, escreva para support@getreadystack.com.

Mais em Outros recursos Ver tudo →