Introdução aos Padrões de Projeto
Parte da seção Programação Orientada a Objetos do Journey de C# da Coddy. Lição 51 de 70.
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, os padrões nos dão um vocabulário compartilhado e abordagens testadas para estruturar o código.
Pense nos padrões de projeto como plantas. Eles não fornecem um código exato para você copiar, mas descrevem como organizar classes e objetos para resolver desafios específicos. Quando alguém menciona “use o padrão Factory aqui”, desenvolvedores experientes entendem imediatamente a estrutura geral que está sendo proposta.
Os padrões de projeto se dividem em três categorias principais:
| Categoria | Finalidade | Exemplos |
|---|---|---|
| Criacionais | Como os objetos são criados | Singleton, Factory |
| Estruturais | Como os objetos são compostos | Adapter, Decorator |
| Comportamentais | Como os objetos se comunicam | Observer, Strategy |
Os padrões que exploraremos baseiam-se diretamente nos conceitos de POO que você já aprendeu - interfaces, herança, polimorfismo e composição. Cada padrão aproveita esses fundamentos de maneiras específicas para alcançar flexibilidade, manutenibilidade ou reusabilidade.
Nas próximas lições, você implementará vários padrões essenciais, começando por Singleton, Factory, Observer e Strategy. Compreender esses padrões ajudará você a reconhecer soluções comuns em bases de código existentes e a tomar melhores decisões arquiteturais em seus próprios projetos.
Desafio
FácilVamos criar um sistema simples de catálogo de padrões que organiza informações sobre padrões de projeto em vários arquivos. Isso ajudará você a entender como os padrões são categorizados enquanto pratica uma boa organização de código.
Você criará três arquivos para separar diferentes responsabilidades:
Pattern.cs: Defina uma classePatternno namespacePatternsque represente um único padrão de projeto. Cada padrão deve ter umName, umaCategory(Criacional, Estrutural ou Comportamental) e umaDescription. Inclua um métodoGetSummary()que retorne uma string formatada:[{Category}] {Name}: {Description}PatternCatalog.cs: Crie uma classePatternCatalogno namespacePatternsque gerencie uma coleção de padrões. Seu catálogo deve ser capaz de adicionar padrões e ter um métodoGetPatternsByCategory(string category)que retorne uma lista de todos os padrões que correspondam a essa categoria. Inclua também um métodoGetAllSummaries()que retorne uma lista de strings de resumo para todos os padrões do catálogo.Program.cs: Reúna tudo criando um catálogo e preenchendo-o com padrões com base na entrada. Em seguida, exiba os padrões filtrados por categoria.
Você receberá as seguintes entradas:
- Número de padrões a adicionar
- Para cada padrão: três linhas contendo nome, categoria e descrição
- Uma categoria para filtrar
Depois de adicionar todos os padrões ao catálogo, imprima os resumos dos padrões que correspondem à categoria do filtro, um por linha. Se nenhum padrão corresponder, imprima No patterns found.
Por exemplo, se as entradas forem:
3
Singleton
Creational
Ensures only one instance exists
Observer
Behavioral
Notifies dependents of state changes
Factory
Creational
Creates objects without specifying exact class
CreationalA saída deverá ser:
[Creational] Singleton: Ensures only one instance exists
[Creational] Factory: Creates objects without specifying exact classEste desafio demonstra como organizar classes relacionadas em arquivos separados mantém sua base de código limpa e fácil de manter — um princípio que se torna ainda mais importante à medida que você implementa padrões de projeto reais nas próximas lições!
Experimente você mesmo
using System;
using System.Collections.Generic;
using Patterns;
class Program
{
public static void Main(string[] args)
{
// Lê o número de padrões
int n = Convert.ToInt32(Console.ReadLine());
// Cria um novo PatternCatalog
PatternCatalog catalog = new PatternCatalog();
// TODO: Lê os detalhes de cada padrão (name, category, description)
// e adiciona-os ao catálogo
for (int i = 0; i < n; i++)
{
string name = Console.ReadLine();
string category = Console.ReadLine();
string description = Console.ReadLine();
// TODO: Cria um Pattern e adiciona-o ao catálogo
}
// Lê a categoria pela qual filtrar
string filterCategory = Console.ReadLine();
// TODO: Obtém os padrões pela categoria de filtro
// e imprime seus resumos
// Se nenhum padrão corresponder, imprime "No patterns found"
}
}
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 ExternosNamespaces e DiretivasIntrodução a Classes e ObjetosA Palavra-chave 'this'Métodos e ParâmetrosCampos vs PropriedadesConstrutoresInicializadores de ObjetosRecapitulação - Calculadora Simples4Herança
Sintaxe Básica de Herança (:)A Palavra-chave 'base'Palavras-chave Virtual e OverrideClasses SeladasA Classe Base 'object'Recapitulação - Hierarquia de Funcionários7Recursos Avançados
Sobrecarga de OperadoresIndexadores (this[])Sobrescrita de ToString()Métodos de ExtensãoRecapitulação - Lista Personalizada10Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoSingleton Thread-SafePadrão FactoryPadrão Observer (Eventos)Padrão Strategy2Propriedades e Membros Estáticos
Propriedades AutoimplementadasPropriedades de Apenas Leitura/EscritaCampos e Métodos EstáticosClasses EstáticasMembros com Corpo de Expressão5Polimorfismo e Interfaces
Polimorfismo: Compilação vs ExecuçãoInterface vs Classe AbstrataMúltiplas InterfacesInterfaces ExplícitasUpcasting e DowncastingRecapitulação - Calculadora de Formas8Conceitos Avançados de POO
Composição sobre HerançaGenerics (Classes e Métodos)Delegates e EventosAtributos e ReflectionIDisposable e a Instrução usingFundamentos de Injeção de Dependência11Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão Composite3Arquitetura de Classes
Dados de Instância vs EstáticosPalavras-chave 'readonly' e 'const'Campos de SuporteRecapitulação - Gerenciador de Conta Bancária6Encapsulamento
Modificadores de AcessoPropriedades para EncapsulamentoImplementação de Ocultação de DadosPadrões de ImutabilidadeRecapitulação - Registros de Estudantes9Argumentos Variáveis
A Palavra-chave 'params'Parâmetros OpcionaisArgumentos NomeadosSobrecarga de MétodosPratique por conta própria: Compilador de C# online