Adriano Azevedo
Blog adrianoazevedo.dev

Blog adrianoazevedo.dev

Aprenda Design Patterns para resolver problemas em design de software

Aprenda Design Patterns para resolver problemas em design de software

Adriano Azevedo's photo
Adriano Azevedo
·Jun 18, 2022·

6 min read

“Um design que não leva em consideração as mudanças corre o risco de uma grande reformulação no futuro.” - Erich Gama

No projeto orientado a objetos, os padrões são soluções típicas para problemas comuns. Quando uma solução aparece repetidas vezes em vários projetos, alguém eventualmente a nomeia e a descreve em detalhes. É assim que os padrões são descobertos.

Os padrões são como blueprints pré-fabricados que você pode personalizar para resolver problemas recorrentes em seu código. Um padrão não é um pedaço específico de código, mas um conceito geral que resolve um problema específico. Você pode seguir os detalhes do padrão e implementar uma solução adequada ao seu próprio programa.

Em 1995, Erich Gamma, John Vlissides, Ralph Johnson e Richard Helm publicaram o livro “Design Patterns: Elements of Reusable Object-Oriented Software”, no qual aplicaram padrões de projeto à programação. Devido ao seu nome longo, passou a ser conhecido como o livro GOF ou os livros da turma dos quatro.

Por que aprender esses padrões de design

É possível ser programador por muitos anos sem conhecer um único padrão. Isso é o que muitas pessoas fazem. Mesmo assim, você pode estar implementando alguns padrões sem saber.

Um padrão de projeto é um conjunto de soluções experimentadas e testadas para problemas comuns de projeto de software. Mesmo que você nunca encontre esses problemas, os padrões de aprendizado ainda são valiosos, pois ensinam como resolver uma variedade de problemas usando os princípios do design orientado a objetos.

Ao fornecer terminologia abreviada, os padrões de design também facilitam a comunicação entre os membros da equipe.

Classificação de padrões de projeto

Os padrões de design se dividem em três categorias principais:

  1. Padrões de criação — Eles fornecem mecanismos de criação de objetos que aumentam a flexibilidade e a reutilização do código existente.
  2. Padrões estruturais — Eles explicam como montar objetos e classes em estruturas maiores, mantendo as estruturas flexíveis e eficientes.
  3. Padrões comportamentais — Eles cuidam da comunicação eficaz e da atribuição de responsabilidades entre os objetos.

GoF Design.png

Padrões de design de criação

Os padrões de criação fornecem vários mecanismos de criação de objetos, que aumentam a flexibilidade e a reutilização do código existente.

Existem 5 padrões de design de criação definidos nos padrões de design GoF:

  1. Singleton — Um singleton é um padrão de design de criação que garante que uma classe tenha apenas uma instância e forneça um ponto de acesso global a essa instância.

  2. Factory — O método Factory é um padrão de projeto criacional que fornece uma interface para criar objetos em uma superclasse enquanto permite que as subclasses alterem o tipo de objeto criado.

  3. Abstract Factory — A fábrica abstrata é um padrão de design criacional que permite produzir classes de objetos relacionados sem especificar suas classes concretas.

  4. Builder — Um Builder é um padrão de design de criação que permite construir objetos complexos passo a passo. Você pode criar diferentes tipos e representações de um objeto usando o mesmo código de construção.

  5. Prototype — Um Prototype é um padrão de design de criação que permite copiar objetos existentes sem tornar seu código dependente de suas classes.

Padrões de Projeto Estrutural

Um padrão de projeto estrutural explica como montar objetos e classes em estruturas maiores, mantendo-os flexíveis e eficientes.

Existem 7 padrões de projeto estruturais definidos nos padrões de projeto GoF:

  1. Adapter — Adapter é um padrão de projeto estrutural que permite que objetos com interfaces incompatíveis se comuniquem.

  2. Composite — Composite é um padrão de projeto estrutural que permite compor objetos em estruturas de árvore e depois trabalhar com essas estruturas como se fossem objetos individuais.

  3. Proxy — Proxy é um padrão de design estrutural que permite fornecer um espaço reservado ou substituto para outro objeto. Usando um proxy, você pode controlar o acesso ao objeto original, permitindo que você faça algo antes ou depois que a solicitação for entregue ao objeto original.

  4. Flyweight — Com o flyweight, você pode encaixar mais objetos na RAM compartilhando partes comuns do estado entre vários objetos, em vez de manter todos os dados em cada um deles.

  5. Facade — Uma Facade é um padrão de projeto que fornece uma interface simplificada para uma biblioteca, uma estrutura ou qualquer outro conjunto de classes.

  6. Bridge — Bridge é um padrão de design que permite dividir uma classe grande ou um conjunto de classes intimamente relacionadas em duas hierarquias separadas — abstração e implementação — que podem ser desenvolvidas independentemente.

  7. Decorator — Usando o padrão de design Decorator , você pode anexar novos comportamentos a objetos colocando-os dentro de objetos wrapper especiais que contêm os novos comportamentos.

Padrões de Design Comportamental

Padrões comportamentais envolvem algoritmos e atribuição de responsabilidades entre objetos.

Existem 11 padrões de design comportamentais definidos nos padrões de design GoF:

  1. Template method — Um Template method é um padrão de design comportamental que define o esqueleto de um algoritmo na superclasse, mas permite que as subclasses substituam etapas específicas sem modificar sua estrutura.

  2. Mediator — Usando o Mediator, você pode reduzir dependências caóticas entre objetos. O padrão restringe a comunicação direta entre os objetos e os força a colaborar apenas por meio de um mediador.

  3. Chain of Responsibility — As Chain of Responsibility permitem que você passe solicitações ao longo de uma cadeia de manipuladores. Ao receber uma solicitação, cada manipulador decide se deve processar a solicitação ou passá-la para o próximo manipulador da cadeia.

  4. Observer — O padrão de Observer permite que você defina um mecanismo para notificar vários objetos sobre eventos que ocorrem no objeto que estão observando.

  5. Strategy — Usando a Strategy, você pode definir uma família de algoritmos, colocá-los em diferentes classes e tornar seus objetos intercambiáveis.

  6. Command — Command é um padrão de design comportamental que transforma solicitações em objetos autônomos contendo todas as informações sobre eles. Com essa transformação, você pode parametrizar métodos com várias solicitações, atrasar ou enfileirar a execução de uma solicitação e oferecer suporte a operações reversíveis.

  7. State — Como um padrão de design comportamental, o State permite que um objeto mude seu comportamento quando seu estado interno muda. Parece que o objeto mudou de classe.

  8. Visitor — Usando o padrão Visitor, você pode separar algoritmos dos objetos nos quais eles operam.

  9. Interpreter — O Interpreter é um padrão de design comportamental que define uma representação gramatical para uma linguagem e fornece um intérprete para lidar com essa gramática.

  10. Iterator — Um padrão de design comportamental chamado Iterator permite percorrer elementos de uma coleção sem expor sua representação subjacente.

  11. Memento — O Memento é um padrão de design comportamental que permite salvar e restaurar o estado anterior de um objeto sem revelar seus detalhes de implementação.

Did you find this article valuable?

Support Adriano Azevedo by becoming a sponsor. Any amount is appreciated!

Learn more about Hashnode Sponsors