Introdução aos Padrões de Projeto
Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy — lição 64 de 87.
Padrões de projeto são soluções comprovadas para problemas comuns que os desenvolvedores encontram repetidamente ao construir software. Em vez de reinventar a roda a cada vez, você pode aplicar esses modelos testados pelo tempo para resolver desafios de design recorrentes.
Pense em padrões de projeto como plantas. Eles não fornecem código pronto para copiar e colar, mas descrevem como estruturar suas classes e objetos para resolver um tipo específico de problema. Os padrões que você aprenderá utilizam os conceitos de POO que você já domina — herança, interfaces, polimorfismo e composição.
Os padrões de projeto se dividem em três categorias principais:
| Categoria | Propósito | Exemplos |
|---|---|---|
| Criacional | Como os objetos são criados | Singleton, Factory, Builder |
| Estrutural | Como os objetos são compostos | Adapter, Decorator, Composite |
| Comportamental | Como os objetos se comunicam | Observer, Strategy, Command |
Por que aprender padrões de projeto? Eles oferecem um vocabulário compartilhado com outros desenvolvedores — dizer "use uma Factory aqui" comunica instantaneamente uma ideia complexa. Eles também ajudam você a escrever código mais flexível e fácil de manter ao aplicar princípios como "programe para uma interface, não para uma implementação".
Nas próximas lições, você implementará vários padrões essenciais, começando com padrões de criação como Singleton e Factory, e depois passando para padrões comportamentais como Observer e Strategy.
Desafio
FácilVamos construir um classificador de padrões simples que demonstra sua compreensão das três categorias de padrões de projeto! Você criará um sistema que categoriza padrões e explica seu propósito, organizando seu código em vários arquivos.
Você criará três arquivos:
Pattern.java: Crie uma interface chamadaPatternque define o contrato para todos os padrões de projeto. Sua interface deve declarar dois métodos:String getCategory()que retorna a categoria do padrão (Creational, Structural, ou Behavioral), eString getPurpose()que retorna uma descrição do que essa categoria de padrões faz.PatternInfo.java: Crie três classes que implementam sua interfacePattern, cada uma representando uma categoria de padrões de projeto:CreationalPattern- deve retornar"Creational"para a categoria e"How objects are created"para o propósito.StructuralPattern- deve retornar"Structural"para a categoria e"How objects are composed"para o propósito.BehavioralPattern- deve retornar"Behavioral"para a categoria e"How objects communicate"para o propósito.Main.java: Reúna seu classificador de padrões! Você receberá uma entrada: um nome de padrão (String) que será um de"Singleton","Factory","Adapter","Decorator","Observer", ou"Strategy".Com base na entrada, crie o objeto de padrão apropriado:
"Singleton"e"Factory"são padrões Creational"Adapter"e"Decorator"são padrões Structural"Observer"e"Strategy"são padrões Behavioral
Armazene seu objeto de padrão em uma variável do tipo
Pattern(a interface), demonstrando o princípio de programar para uma interface. Em seguida, imprima as três linhas seguintes:Pattern: [input pattern name]Category: [category from getCategory()]Purpose: [purpose from getPurpose()]
Você receberá uma entrada: o nome de um padrão de projeto (String).
Este desafio reforça o insight principal da lição: os padrões de projeto são organizados em categorias com base no problema que resolvem. Ao usar uma interface, você também está praticando o princípio de "programar para uma interface, não para uma implementação" - um conceito central que torna os padrões de projeto tão poderosos!
Folha de consulta
Padrões de projeto (Design patterns) são soluções comprovadas para problemas comuns no desenvolvimento de software. Eles são modelos que descrevem como estruturar classes e objetos para resolver tipos específicos de problemas.
Os padrões de projeto se dividem em três categorias principais:
| Categoria | Objetivo | Exemplos |
|---|---|---|
| Criacionais | Como os objetos são criados | Singleton, Factory, Builder |
| Estruturais | Como os objetos são compostos | Adapter, Decorator, Composite |
| Comportamentais | Como os objetos se comunicam | Observer, Strategy, Command |
Os padrões de projeto fornecem um vocabulário compartilhado entre os desenvolvedores e ajudam a escrever códigos mais flexíveis e fáceis de manter, aplicando princípios como "programar para uma interface, não para uma implementação".
Experimente você mesmo
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String patternName = scanner.nextLine();
// TODO: Declare uma variável do tipo Pattern (a interface)
Pattern pattern = null;
// TODO: Com base em patternName, crie o objeto de padrão apropriado:
// - "Singleton" e "Factory" são padrões Creational
// - "Adapter" e "Decorator" são padrões Structural
// - "Observer" e "Strategy" são padrões Behavioral
// TODO: Imprima a saída no seguinte formato:
// Pattern: [input pattern name]
// Category: [category de getCategory()]
// Purpose: [purpose de getPurpose()]
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosA Palavra-chave thisMétodosCampos (Atributos)Método ConstrutorSobrecarga de ConstrutorRecapitulação - Calculadora Simples4Herança
Herança Básica (extends)A Palavra-chave superSobrescrita de Método (@Override)Encadeamento de ConstrutoresA Classe ObjectHerança Simples e MultinívelPor que não há Herança Múltipla de ClassesRecapitulação - Hierarquia de Funcionários7Métodos Especiais e a Classe Object
Método toString()equals() e hashCode()Método clone()compareTo() e ComparableInterface ComparatorRecapitulação - Ordenação Personalizada2Modificadores de Acesso e Encapsulamento
Visão Geral dos Níveis de AcessoMétodos Getter e SetterOcultação de InformaçõesA Palavra-chave finalRecapitulação - Gerenciador de Conta Bancária5Polimorfismo
Fundamentos de Sobrecarga de MétodosSobrescrita de Métodos (Tempo de Execução)Upcasting e DowncastingO Operador instanceofClasses e Métodos AbstratosRecapitulação - Calculadora de Formas8Conceitos Avançados de OOP
Composição vs HerançaAgregação vs ComposiçãoClasses Internas, Aninhadas e AnônimasEnums e Métodos de EnumRecords (Java 16+)Classes Seladas (Java 17+)11Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão BuilderPadrão ObserverPadrão Strategy3Propriedades de Classe e Membros Estáticos
Variáveis de Instância vs EstáticasMétodos EstáticosBlocos EstáticosConstantes (static final)Recapitulação - Contador e Utilitário6Interfaces e Classes Abstratas
Introdução às InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesDefault e Static em InterfacesClasses Abstratas vs InterfacesInterfaces FuncionaisRecapitulação - Sistema de Pagamento9Generics
Introdução a GenericsClasses GenéricasMétodos GenéricosParâmetros de Tipos DelimitadosWildcards (?, extends, super)Recapitulação - Container Genérico12Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Iterator