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