Introdução aos Padrões de Projeto
Parte da seção Programação Orientada a Objetos do Journey de C++ da Coddy — lição 90 de 104.
Padrões de projeto são soluções comprovadas e reutilizáveis para problemas comuns que surgem no design de software. Eles não são códigos que você copia diretamente — são modelos ou plantas que descrevem como estruturar classes e objetos para resolver desafios específicos de forma elegante.
O conceito foi popularizado pelo "Gang of Four" (GoF) em seu livro de 1994, que catalogou 23 padrões fundamentais. Esses padrões são tipicamente agrupados em três categorias:
| Categoria | Propósito | Exemplos |
|---|---|---|
| Criacional | Mecanismos de criação de objetos | Singleton, Factory, Builder |
| Estrutural | Composição de classes e objetos | Adapter, Decorator, Composite |
| Comportamental | Interação e responsabilidade de objetos | Observer, Strategy, Command |
Por que aprender padrões de projeto? Eles fornecem um vocabulário compartilhado entre desenvolvedores - dizer "use uma Factory aqui" comunica instantaneamente uma ideia complexa. Eles também ajudam você a evitar reinventar soluções e tornam seu código mais flexível e fácil de manter.
Em C++, os padrões de projeto aproveitam os recursos de POO que você já aprendeu: herança, polimorfismo, classes abstratas e templates. Ao longo das próximas lições, você implementará diversos padrões essenciais e entenderá quando cada um é a ferramenta certa para o trabalho.
Desafio
FácilVamos construir um classificador de padrões simples que demonstre sua compreensão das três categorias de padrões de projeto. Você criará um sistema que recebe o nome de um padrão e identifica a qual categoria ele pertence—Creational, Structural, ou Behavioral—junto com uma breve descrição do propósito dessa categoria.
Você organizará seu código em três arquivos:
PatternCategory.h: Defina uma classe base abstrata chamadaPatternCategoryque representa uma categoria de padrão de projeto. Ela deve ter:- Um método virtual puro
getName()que retorna o nome da categoria como uma string - Um método virtual puro
getPurpose()que retorna uma descrição do que os padrões nesta categoria fazem - Um destrutor virtual
Em seguida, crie três classes derivadas que herdam de
PatternCategory:CreationalCategory— retorna o nome"Creational"e o propósito"Object creation mechanisms"StructuralCategory— retorna o nome"Structural"e o propósito"Class and object composition"BehavioralCategory— retorna o nome"Behavioral"e o propósito"Object interaction and responsibility"
- Um método virtual puro
PatternClassifier.h: Crie uma classePatternClassifierque possa identificar a qual categoria um determinado padrão pertence.Seu classificador deve ter um método
classifyque recebe o nome de um padrão (string) e retorna um ponteiro para aPatternCategoryapropriada. Use ponteiros inteligentes (std::unique_ptr) para o gerenciamento de memória.O classificador deve reconhecer estes padrões:
- Creational:
Singleton,Factory,Builder - Structural:
Adapter,Decorator,Composite - Behavioral:
Observer,Strategy,Command
Se o nome do padrão não for reconhecido, retorne
nullptr.- Creational:
main.cpp: Leia uma única entrada—o nome de um padrão de projeto.Crie um
PatternClassifiere use-o para classificar o padrão de entrada. Se o padrão for reconhecido, imprima:[PatternName] is a [CategoryName] pattern Purpose: [CategoryPurpose]Se o padrão não for reconhecido, imprima:
Unknown pattern: [PatternName]
Por exemplo, com a entrada Singleton:
Singleton is a Creational pattern
Purpose: Object creation mechanismsCom a entrada Observer:
Observer is a Behavioral pattern
Purpose: Object interaction and responsibilityCom a entrada Proxy:
Unknown pattern: ProxyEste desafio reforça as três categorias de padrões de projeto enquanto pratica herança, polimorfismo e ponteiros inteligentes—todos conceitos que você já domina. A estrutura de múltiplos arquivos reflete como projetos reais organizam classes relacionadas.
Folha de consulta
Padrões de projeto são soluções reutilizáveis para problemas comuns de design de software. Eles servem como modelos para estruturar classes e objetos, não como código direto para copiar.
Padrões de projeto são agrupados em três categorias principais:
| Categoria | Propósito | Exemplos |
|---|---|---|
| Criacional | Mecanismos de criação de objetos | Singleton, Factory, Builder |
| Estrutural | Composição de classes e objetos | Adapter, Decorator, Composite |
| Comportamental | Interação e responsabilidade de objetos | Observer, Strategy, Command |
Benefícios dos padrões de projeto:
- Fornecem um vocabulário compartilhado entre desenvolvedores
- Evitam reinventar soluções para problemas comuns
- Tornam o código mais flexível e fácil de manter
Em C++, os padrões de projeto aproveitam recursos de POO, incluindo herança, polimorfismo, classes abstratas e templates.
Experimente você mesmo
#include <iostream>
#include <string>
#include "PatternClassifier.h"
int main() {
// Ler o nome do padrão
std::string patternName;
std::cin >> patternName;
// TODO: Criar uma instância de PatternClassifier
// TODO: Usar o classificador para classificar o padrão de entrada
// TODO: Se o padrão for reconhecido, imprima:
// "[PatternName] is a [CategoryName] pattern"
// "Purpose: [CategoryPurpose]"
// TODO: Se o padrão não for reconhecido (nullptr), imprima:
// "Unknown pattern: [PatternName]"
return 0;
}
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 OOP
Arquivos ExternosBuild e Compilação em C++Arquivos Header e SourceNamespaces e EscopoIntrodução a OOP em C++Classes vs ObjetosO Ponteiro 'this'Métodos (Funções Membro)Atributos (Membros de Dados)Básico de Ctors e DtorsRecapitulação - Calculadora Simples4Propriedades de Classe
Membros de Instância vs EstáticosGetters e SettersFunções de Membro ConstPalavra-chave MutableMétodos e Variáveis EstáticosFunções e Classes FriendRecapitulação - Gerenciador de Conta Bancária7Herança
Herança BásicaNíveis de Acesso na HerançaOrdem de Chamada de Ctor e DtorSobrescrita de MétodosFunções Virtuais e VTableHerança MúltiplaHerança VirtualRecapitulação - Hierarquia de Funcionários10Visão Geral da STL
Visão Geral e Filosofia da STLContainers da STLIteradoresAlgoritmos da STLFunctors e Expressões LambdaRecapitulação - Frequência de Palavras13Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonFactory e Abstract FactoryPadrão BuilderPadrão ObserverPadrão Strategy2Gerenciamento de Memória
Memória Stack vs HeapPonteiros e ReferênciasMemória Dinâmica (new/delete)Smart Pointers em C++RAII em C++Recapitulação - Gerenciador de Array Dinâmico5Encapsulamento
Especificadores de Acesso em C++Especificadores de Acesso em DetalhesOcultação de InformaçãoStruct vs ClassClasses Aninhadas e InternasRecapitulação - Sistema de Registros de Alunos8Polimorfismo
Polimorfismo de Compilação vs Tempo de ExecuçãoSobrecarga de FunçõesFunções Virtuais RevisitadasFunções Virtuais PurasClasses AbstratasDesign de Interfaces em C++Dynamic Casting e RTTIRecapitulação - Calculadora de Formas3Construtores e Destrutores
Construtor PadrãoConstrutor ParametrizadoConstrutor de CópiaConstrutor de MovimentaçãoListas de Inicialização do ConstrutorConstrutores DelegadosMergulho Profundo em DestrutoresRegra dos Três / Cinco / ZeroRecapitulação - Classe String6Sobrecarga de Operadores
Introdução à Sobrecarga de OperadoresSobrecarga de Operadores AritméticosSobrecarga de Operadores de ComparaçãoOperadores de StreamSobrecarga do Operador de AtribuiçãoSobrecarga dos Operadores [] e ()Operadores de Conversão de TipoRecapitulação - Classe Matrix9Templates
Templates de FunçãoTemplates de ClasseEspecialização de TemplatesTemplates VariádicosFundamentos de SFINAE e Type TraitsRecapitulação - Container Genérico