Padrões de Projeto do GoF: Soluções Comprovadas para Desenvolvimento de Software

Padrões de projeto foram fundamentais ao longo da minha carreira, pois são soluções comprovadas para problemas comuns no desenvolvimento de software. Eles fornecem uma maneira de criar código mais modular, reutilizável e fácil de manter. O grupo mais conhecido de padrões de projeto é o conjunto de 23 padrões apresentados no livro Design Patterns: Elements of Reusable Object-Oriented Software, de autoria do chamado Gang of Four (GoF) – Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides.

Há uma divisão em três categorias: padrões de criação, padrões de estrutura e padrões de comportamento. Neste artigo, vamos explorar cada uma dessas categorias e entender como elas podem ser usadas para resolver problemas de software.

Padrões de criação

Lidam com a maneira de criar objetos, isolando o processo de criação de um objeto do seu uso final. Esses padrões incluem o padrão Singleton, que garante que apenas uma única instância de uma determinada classe seja criada e usada em todo o sistema. Outro exemplo é o padrão Factory Method, que define uma interface para criar objetos, mas permite que as subclasses decidam qual classe concreta criar.

Padrões de estrutura

Os padrões de estrutura atuam com a organização de classes e objetos em estruturas maiores. Esses padrões incluem o padrão Adapter, que converte a interface de uma classe em outra interface que o cliente espera. Outro exemplo é o padrão Facade, que fornece uma interface unificada para um conjunto de interfaces em um subsistema, simplificando o uso do subsistema para os clientes.

Padrões de comportamento

Agem na comunicação entre objetos e na distribuição de responsabilidades entre eles. Esses padrões incluem o padrão Observer, que define uma dependência um-para-muitos entre objetos, de modo que quando um objeto muda de estado, todos os seus dependentes são notificados e atualizados automaticamente. Outro exemplo é o padrão Strategy, que define uma família de algoritmos e encapsula cada um deles, permitindo que sejam intercambiados de forma transparente em tempo de execução.

Exemplo de implementação em C#

Para exemplificar a implementação de padrões de projeto em C#, vamos criar uma classe que usa o padrão Factory Method para criar objetos. O Factory Method define uma interface para criar objetos, mas permite que as subclasses decidam qual classe concreta criar. Isso permite que o código seja mais flexível e extensível, pois novas classes podem ser adicionadas sem modificar o código existente.

C#
using System;

// Classe abstrata que define a interface para criar objetos
abstract class Creator
{
    // O Factory Method retorna um objeto da classe Product
    public abstract Product FactoryMethod();
}

// Classe concreta que implementa o Factory Method
class ConcreteCreator : Creator
{
    // Sobrescrevendo o Factory Method para retornar uma instância de ConcreteProduct
    public override Product FactoryMethod()
    {
        return new ConcreteProduct();
    }
}

// Classe abstrata que define a interface do objeto a ser criado
abstract class Product
{
    public abstract void Operation();
}

// Classe concreta que implementa a interface do objeto a ser criado
class ConcreteProduct : Product
{
    public override void Operation()
    {
        Console.WriteLine("Operação do ConcreteProduct");
    }
}

// Classe de teste que cria um objeto usando o Factory Method
class Client
{
    static void Main(string[] args)
    {
        // Cria uma instância de ConcreteCreator
        Creator creator = new ConcreteCreator();

        // Usa o Factory Method para criar um objeto de ConcreteProduct
        Product product = creator.FactoryMethod();

        // Chama a operação do objeto criado
        product.Operation();
    }
}

// Fonte: Chat GPT

Neste exemplo, a classe abstrata Creator define a interface para criar objetos, enquanto a classe concreta ConcreteCreator implementa o Factory Method para criar objetos da classe ConcreteProduct. A classe abstrata Product define a interface do objeto a ser criado, enquanto a classe concreta ConcreteProduct implementa a interface do objeto a ser criado. Por fim, a classe de teste Client usa o Factory Method para criar um objeto de ConcreteProduct e chama a operação do objeto criado.

Esse é apenas um exemplo simples que utiliza o padrão Factory Method. Existem muitos outros padrões de projeto que podem ser aplicados em diferentes situações para melhorar a estrutura e a organização do código.

Exemplo de implementação em Java

Confira o código em Java equivalente ao código em C# que implementa o padrão Factory Method:

Java
import java.util.*;

// Classe abstrata que define a interface para criar objetos
abstract class Creator {
    // O Factory Method retorna um objeto da classe Product
    public abstract Product factoryMethod();
}

// Classe concreta que implementa o Factory Method
class ConcreteCreator extends Creator {
    // Sobrescrevendo o Factory Method para retornar uma instância de ConcreteProduct
    public Product factoryMethod() {
        return new ConcreteProduct();
    }
}

// Classe abstrata que define a interface do objeto a ser criado
abstract class Product {
    public abstract void operation();
}

// Classe concreta que implementa a interface do objeto a ser criado
class ConcreteProduct extends Product {
    public void operation() {
        System.out.println("Operação do ConcreteProduct");
    }
}

// Classe de teste que cria um objeto usando o Factory Method
public class Main {
    public static void main(String[] args) {
        // Cria uma instância de ConcreteCreator
        Creator creator = new ConcreteCreator();

        // Usa o Factory Method para criar um objeto de ConcreteProduct
        Product product = creator.factoryMethod();

        // Chama a operação do objeto criado
        product.operation();
    }
}

// Fonte: Chat GPT

O código em Java é muito semelhante ao código em C#. A principal diferença é a sintaxe, como a declaração de tipos de dados e o uso de chaves em blocos de código. Fora isso, a lógica é a mesma.

Exemplo de implementação em Python

Confira também o código em Python equivalente ao código em C# que implementa o padrão Factory Method:

Python
# Classe abstrata que define a interface para criar objetos
from abc import ABC, abstractmethod

class Creator(ABC):
    # O Factory Method retorna um objeto da classe Product
    @abstractmethod
    def factory_method(self):
        pass

# Classe concreta que implementa o Factory Method
class ConcreteCreator(Creator):
    # Sobrescrevendo o Factory Method para retornar uma instância de ConcreteProduct
    def factory_method(self):
        return ConcreteProduct()

# Classe abstrata que define a interface do objeto a ser criado
class Product(ABC):
    @abstractmethod
    def operation(self):
        pass

# Classe concreta que implementa a interface do objeto a ser criado
class ConcreteProduct(Product):
    def operation(self):
        print("Operação do ConcreteProduct")

# Classe de teste que cria um objeto usando o Factory Method
def main():
    # Cria uma instância de ConcreteCreator
    creator = ConcreteCreator()

    # Usa o Factory Method para criar um objeto de ConcreteProduct
    product = creator.factory_method()

    # Chama a operação do objeto criado
    product.operation()

if __name__ == "__main__":
    main()

# Fonte: Chat GPT

Em Python, a principal diferença em relação ao C# e Java é que não há necessidade de declarar explicitamente as interfaces. Em vez disso, usamos a biblioteca padrão abc para definir classes abstratas. Além disso, a sintaxe de classes e métodos é diferente, e a declaração da classe ConcreteProduct não precisa especificar a herança de object, pois isso é implicitamente herdado em Python 3.

Fora isso, a lógica é a mesma. A classe abstrata Creator define a interface para criar objetos, enquanto a classe concreta ConcreteCreator implementa o Factory Method para criar objetos da classe ConcreteProduct. A classe abstrata Product define a interface do objeto a ser criado, enquanto a classe concreta ConcreteProduct implementa a interface do objeto a ser criado. Por fim, a função main usa o Factory Method para criar um objeto de ConcreteProduct e chama a operação do objeto criado.

Conclusão

Os padrões de projeto do GoF fornecem soluções comprovadas para problemas comuns no desenvolvimento de software. Divididos em três categorias – padrões de criação, padrões de estrutura e padrões de comportamento -, eles oferecem uma ampla variedade de soluções para diferentes problemas de software.

É importante lembrar que cada padrão tem seus próprios prós e contras, e é necessário entender quando e como aplicá-los corretamente. Espero que este artigo tenha ajudado a fornecer uma introdução clara e didática aos padrões de projeto do GoF, permitindo que programadores iniciantes comecem a explorar esse tópico fascinante.

Esse conteúdo é parte do material disponibilizado para os participantes do meu grupo de estudos de Padrões de Projeto. Você quer participar desse grupo? Clique aqui e veja como funciona.

Quer se aprofundar neste tema?

Então participe do grupo de estudos de Padrões de Projeto.

Desenvolva soluções simples para os problemas mais complexos. Escreva código fácil de entender, mais barato para manter e evoluir.

Participe do
grupo intensivo de

Padrões de Projeto

com

Desenvolva soluções simples para os problemas mais complexos. Escreva código fácil de entender, mais barato para manter e evoluir.

Participe do
grupo intensivo de

Padrões de Projeto

com

Desenvolva soluções simples para os problemas mais complexos. Escreva código fácil de entender, mais barato para manter e evoluir.

Veja outros artigos relacionados

Quer Melhorar Seu Design? Aplique CQS

Nesse mundo cada vez mais acelerado da tecnologia da informação, uma das metas constantes para desenvolvedores é a otimização e...

Você Precisa Conhecer o State Pattern

Em minha jornada como desenvolvedor de software, a descoberta e compreensão do State Pattern foi um divisor de águas, assim...

Como padrões ajudam a reduzir o impacto da escassez de recursos

Quando pensamos em software development, um dos grandes desafios é criar sistemas eficientes especialmente em ambientes com recursos limitados. Diante...

Programa ElemarJR de
Aceleração de Resultados, do Jeito Certo

Aproveite nossa OFERTA ESPECIAL e adquira o combo completo com acesso a todos os grupos de estudos.

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de DDD do Jeito Certo:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de DDD do Jeito Certo:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Padrões de Projeto:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de DDD do Jeito Certo:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no curso de Padrões de Projeto do GoF: Soluções Comprovadas para Desenvolvimento de Software:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Reputação e Marketing Pessoal:

Padrões de Projeto do GoF: Soluções Comprovadas para Desenvolvimento de Software

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no curso de Padrões de Projeto do GoF: Soluções Comprovadas para Desenvolvimento de Software:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no curso de Padrões de Projeto do GoF: Soluções Comprovadas para Desenvolvimento de Software:

Mentoria em Arquitetura de Software

Ênfase em Systems Design

Para se candidatar nesta turma aberta, preencha o formulário a seguir:

Reproduzir vídeo

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Algoritmos e Estruturas de Dados:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Algoritmos e Estruturas de Dados:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Padrões de Projeto:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de DDD do Jeito Certo:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Reputação e Marketing Pessoal:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Padrões de Projeto:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Reputação e Marketing Pessoal:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Reputação e Marketing Pessoal:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Programa ElemarJR de Aceleração, Do Jeito Certo:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Programa ElemarJR de Aceleração, Do Jeito Certo:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Algoritmos e Estruturas de Dados:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Algoritmos e Estruturas de Dados:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Padrões de Projeto:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Padrões de Projeto:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Reputação e Marketing Pessoal:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Algoritmos e Estruturas de Dados:

× Precisa de ajuda?