Publicado em
· 16 de julho de 2026

Design Patterns: o que são e como aplicar em software

Blog
  • Foto de Henrico Piubello
    Henrico Piubello
    Henrico Piubello
    Especialista de TI - Grupo Voitto

    Especialista de TI - Grupo Voitto

Design Patterns (padrões de projeto) são soluções reutilizáveis e testadas para problemas recorrentes no design de software. Em vez de reinventar a roda, você aplica um modelo consagrado — adaptado ao seu contexto — e ganha vocabulário comum, código mais previsível e sistemas mais fáceis de manter.

O que são Design Patterns?

Design Patterns são descrições formais de soluções para problemas comuns de design orientado a objetos: cada padrão nomeia o problema, a estrutura de classes que o resolve, as consequências da escolha e exemplos de uso. Eles foram popularizados em 1994 pelo livro Design Patterns: Elements of Reusable Object-Oriented Software, escrito por Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides — a "Gangue dos Quatro" (GoF) — que catalogou 23 padrões.

O ponto essencial: um padrão não é um trecho de código pronto para copiar e colar. É um modelo de relacionamento entre classes e objetos que você implementa na sua linguagem, no seu domínio. Dois sistemas podem usar o mesmo padrão Observer com códigos completamente diferentes.

O benefício mais subestimado é a comunicação. Dizer "esse módulo expõe uma Facade" ou "troquei o if gigante por Strategy" transmite uma decisão de arquitetura inteira em uma frase — o mesmo papel que os princípios de clean code cumprem na legibilidade, os padrões cumprem no design.

Quais são as categorias de Design Patterns?

Os 23 padrões do GoF dividem-se em três categorias, conforme o tipo de problema que resolvem: criação de objetos, composição de estruturas e comunicação entre objetos.

CategoriaProblema que resolvePadrões mais conhecidos
CriacionaisComo criar objetos de forma flexível e desacopladaSingleton, Factory Method, Abstract Factory, Builder, Prototype
EstruturaisComo compor classes e objetos em estruturas maioresAdapter, Decorator, Facade, Composite, Proxy, Bridge
ComportamentaisComo objetos interagem e dividem responsabilidadesObserver, Strategy, Command, Iterator, State, Chain of Responsibility

Os criacionais desacoplam o código da forma concreta de instanciar objetos — útil quando a criação é cara, condicional ou precisa ser controlada. Os estruturais organizam relações: adaptam interfaces incompatíveis, adicionam responsabilidades sem herança, simplificam subsistemas complexos. Os comportamentais definem fluxos de comunicação: quem notifica quem, como algoritmos são trocados em tempo de execução, como pedidos viram objetos.

Quais padrões são mais usados na prática?

Na prática do dia a dia, meia dúzia de padrões resolve a grande maioria dos problemas — e você provavelmente já os usa sem nomear:

  1. Singleton (criacional): garante uma única instância de uma classe com acesso global — típico em conexões de banco, loggers e configurações. Use com parcimônia: em excesso vira estado global disfarçado e dificulta testes.
  2. Factory Method (criacional): delega a criação de objetos a um método que decide qual classe concreta instanciar. É a base da injeção de dependência em frameworks como Spring e NestJS.
  3. Adapter (estrutural): converte a interface de uma classe existente na interface que o cliente espera — o padrão por trás de todo wrapper de SDK de terceiros.
  4. Decorator (estrutural): adiciona comportamento a um objeto sem alterar sua classe, embrulhando-o. Middlewares e interceptors de requisição HTTP seguem essa ideia.
  5. Observer (comportamental): objetos "inscritos" são notificados quando o estado de outro muda. É o coração de sistemas de eventos, do DOM do navegador à reatividade do React e do Vue.
  6. Strategy (comportamental): encapsula algoritmos intercambiáveis atrás de uma interface única — o antídoto clássico para cadeias de if/else que escolhem "como calcular" algo (frete, desconto, ordenação).

Exemplo prático: um checkout que aceita Pix, cartão e boleto. Sem padrão, um switch cresce a cada novo meio de pagamento. Com Strategy, cada meio vira uma classe com o método processar(), e o checkout recebe a estratégia pronta — adicionar um meio novo não toca no código existente, respeitando o princípio aberto/fechado.

Design Patterns ainda importam com frameworks modernos?

Sim — os padrões não sumiram, foram absorvidos pelas ferramentas. Os frameworks modernos são coleções de padrões empacotados: o container de injeção de dependência combina Factory e Singleton; o roteamento com middlewares é Chain of Responsibility; hooks de estado implementam Observer; ORMs usam Proxy e Unit of Work.

Conhecer os padrões muda a relação com o framework: você deixa de decorar APIs e passa a reconhecer a intenção por trás delas — o que acelera o aprendizado de qualquer stack nova e ajuda a decidir quando sair do caminho feliz. Em arquiteturas distribuídas, os mesmos princípios reaparecem em escala maior: um API Gateway é uma Facade de microsserviços, e filas de eventos são Observer entre sistemas.

Quando usar (e quando evitar) Design Patterns?

Use um padrão quando o problema que ele resolve já apareceu no código; evite quando a motivação é apenas "seguir boas práticas". Padrões têm custo: cada um adiciona indireção e classes extras. A pergunta certa não é "qual padrão posso usar aqui?", e sim "que problema estou tendo — e existe um padrão para ele?".

Sinais de que um padrão vai ajudar:

  • O mesmo if/else sobre "tipos" se repete em vários pontos (Strategy ou polimorfismo).
  • Criar um objeto exige conhecer detalhes demais de implementação (Factory ou Builder).
  • Uma mudança de estado precisa ser refletida em vários lugares (Observer).
  • Você precisa integrar uma biblioteca cuja interface não combina com seu código (Adapter).

Sinais de overengineering: abstrações com uma única implementação, fábricas que criam sempre a mesma classe, camadas que só repassam chamadas. Nesses casos, código direto e simples vence — refatorar para um padrão depois é mais barato do que carregar complexidade especulativa desde o início.

Como aprender Design Patterns de forma eficiente?

A forma mais eficiente de aprender é ligar cada padrão a um problema que você já viveu, em três passos:

  1. Estude o problema antes da estrutura. Para cada padrão, formule em uma frase a dor que ele resolve ("mudanças de estado precisam notificar interessados" → Observer).
  2. Encontre os padrões no código que você já usa. Abra o código do seu framework favorito ou identifique padrões nas bibliotecas do dia a dia — é o melhor catálogo de exemplos reais.
  3. Refatore código seu. Pegue um switch extenso ou uma classe-Deus de um projeto pessoal e aplique Strategy ou Facade. Errar a dose em código de estudo ensina mais que qualquer leitura — e uma boa base de lógica de programação torna o processo natural.

Recursos recomendados: o livro do GoF (referência formal), Head First Design Patterns (didático) e o site Refactoring.Guru, que ilustra os 23 padrões com exemplos em várias linguagens.

Conclusão

Design Patterns são o vocabulário compartilhado da engenharia de software: soluções testadas por décadas para problemas que todo sistema orientado a objetos enfrenta. Dominar as três categorias — criacionais, estruturais e comportamentais — e reconhecer os seis ou sete padrões mais frequentes torna seu código mais previsível, suas conversas de arquitetura mais precisas e seu aprendizado de frameworks mais rápido. Mas o critério é tão importante quanto o catálogo: padrão bom é o que resolve um problema real do seu código, não o que enfeita o diagrama. Comece simples, identifique a dor e só então aplique o padrão — essa é a essência de uma arquitetura robusta e escalável.

## faq

Perguntas frequentes

O que são Design Patterns em programação?

Design Patterns (padrões de projeto) são soluções genéricas, testadas e documentadas para problemas que aparecem repetidamente no design de software orientado a objetos. Eles não são código pronto para copiar, mas modelos de estrutura e interação entre classes que você adapta ao seu contexto.

Quais são as três categorias de Design Patterns?

Criacionais, que tratam da criação de objetos (Singleton, Factory Method, Builder); estruturais, que organizam a composição de classes e objetos (Adapter, Decorator, Facade); e comportamentais, que definem como objetos interagem e distribuem responsabilidades (Observer, Strategy, Command).

Preciso decorar todos os 23 padrões do GoF?

Não. Na prática, um subconjunto resolve a maioria dos casos: Factory Method, Singleton, Adapter, Decorator, Observer e Strategy. O importante é reconhecer o problema que cada padrão resolve para saber quando (e se) aplicá-lo — decorar a estrutura sem entender o problema leva a uso indevido.

Design Patterns ainda fazem sentido com frameworks modernos?

Sim — eles estão embutidos nos próprios frameworks. O React usa Observer no sistema de estado, injeção de dependência do Spring e do NestJS usa Factory e Singleton, e middlewares do Express seguem Chain of Responsibility. Conhecer os padrões ajuda a entender e estender essas ferramentas.

Quando NÃO usar um Design Pattern?

Quando o problema ainda não existe. Aplicar padrões preventivamente, "porque é boa prática", adiciona camadas de abstração que dificultam a leitura e a manutenção — o chamado overengineering. Comece simples e introduza o padrão quando a dor que ele resolve aparecer de fato no código.

Temas deste artigo

## continue lendo

Continue navegando

Sobre o autor

Foto de Henrico Piubello

Henrico Piubello

Especialista de TI - Grupo Voitto · Grupo Voitto

Ver perfil e todos os artigos