Menu
Coddy logo textTech

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.

challenge icon

Desafio

Fácil

Vamos 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 chamada PatternCategory que 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"
  • PatternClassifier.h: Crie uma classe PatternClassifier que possa identificar a qual categoria um determinado padrão pertence.

    Seu classificador deve ter um método classify que recebe o nome de um padrão (string) e retorna um ponteiro para a PatternCategory apropriada. 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.

  • main.cpp: Leia uma única entrada—o nome de um padrão de projeto.

    Crie um PatternClassifier e 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 mechanisms

Com a entrada Observer:

Observer is a Behavioral pattern
Purpose: Object interaction and responsibility

Com a entrada Proxy:

Unknown pattern: Proxy

Este 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;
}
quiz iconTeste seus conhecimentos

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