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!
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