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 em padrões de projeto como plantas. Eles não fornecem o código exato para 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.
Padrões de projeto se dividem em três categorias principais:
| Categoria | Propósito | 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 com 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 construir um sistema simples de catálogo de padrões que organiza informações de 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 representa um único padrão de projeto. Cada padrão deve ter umName,Category(Creational, Structural, ou Behavioral) e umaDescription. Inclua um métodoGetSummary()que retorna uma string formatada:[{Category}] {Name}: {Description}PatternCatalog.cs: Crie uma classePatternCatalogno namespacePatternsque gerencia uma coleção de padrões. Seu catálogo deve ser capaz de adicionar padrões e ter um métodoGetPatternsByCategory(string category)que retorna uma lista de todos os padrões que correspondem a essa categoria. Também inclua um métodoGetAllSummaries()que retorna uma lista de strings de resumo para todos os padrões no catálogo.Program.cs: Reúna tudo criando um catálogo e preenchendo-o com padrões baseados na entrada. Em seguida, exiba os padrões filtrados por categoria.
Você receberá as seguintes entradas:
- Número de padrões a serem adicionados
- Para cada padrão: três linhas contendo name, category e description
- Uma categoria para filtrar
Após adicionar todos os padrões ao seu 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 deve 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 sustentável - um princípio que se torna ainda mais importante à medida que você implementa padrões de projeto reais nas próximas lições!
Folha de consulta
Padrões de projeto são soluções comprovadas para problemas comuns no desenvolvimento de software. Eles fornecem modelos para organizar classes e objetos, em vez de código exato para copiar.
Os padrões de projeto se dividem em três categorias principais:
| Categoria | Propósito | 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 de projeto baseiam-se em conceitos de POO como interfaces, herança, polimorfismo e composição para alcançar flexibilidade, manutenibilidade e reusabilidade.
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étodos