Design Patterns
Tags: designpatterns, softwareengineering, coding, go
Published: 2024-07-04 18:45:24

Hoje vamos mergulhar no mundo dos Design Patterns. Se você já passou horas tentando descobrir a melhor maneira de estruturar seu código ou se perguntando "deve haver uma maneira mais fácil de fazer isso", então você está no lugar certo!

## O que são Design Patterns

Design Patterns são como as receitas que os desenvolvedores usam para resolver problemas comuns em programação. Eles não são código pronto para copiar e colar, mas sim guias que nos ajudam a organizar o pensamento e encontrar soluções elegantes e eficientes para problemas que muitos desenvolvedores já enfrentaram antes.

Imagine que você está construindo um Lego. Há uma maneira bagunçada de jogar todas as peças juntas esperando que algo legal saia, e há uma maneira de seguir os passos que garantem que você vai acabar com uma nave espacial incrível. Os padrões de design são esses passos no mundo da programação.

Neste artigo, vamos explorar os padrões de design mais comuns, que são como os hits clássicos da música: sempre relevantes, independentemente das tendências. 😅

Podemos separar os padrões em 3 categorias:

**Creational Patterns:** Esses padrões, como o próprio nome sugere, são todos sobre a arte de criar objetos. Eles são os mestres da flexibilidade, oferecendo uma forma de trazer objetos à vida de maneira clara e sem complicações. É como ter uma receita de bolo que você pode ajustar dependendo do que tem na despensa, sem perder o sabor! Alguns exemplos incluem o Singleton, que garante que um objeto seja único no sistema, o Factory, que é como um chef que prepara diferentes pratos (objetos) dependendo do pedido, e o Builder, perfeito para montar objetos passo a passo, como um Lego. 


**Structural Patterns:** Esses padrões são como os maestros de uma orquestra, coordenando a composição de classes e objetos para formar estruturas maiores, mantendo tudo flexível e eficiente. Eles garantem que as classes e os objetos possam trabalhar juntos de maneira eficaz. Alguns exemplos clássicos são o padrão Adapter, que ajuda peças diferentes a se encaixarem, o padrão Decorator, que adiciona um toque especial sem alterar o núcleo, e o padrão Composite, que agrupa vários objetos em um só, tipo um combo de lanche!


**Behavior Patterns:** Esses padrões são os especialistas em "fofoca" da programação, cuidando de todas as interações e comunicações entre objetos e classes. Eles são como os organizadores de uma festa, garantindo que todos saibam suas responsabilidades e o que está rolando, para que a conversa flua sem confusão. Um bom papo entre os objetos! Alguns exemplos desses organizadores sociais incluem o padrão Observer, que é como ter alguém que fica de olho em tudo e avisa os outros quando algo importante acontece; o padrão Strategy, que permite mudar a tática no meio do jogo sem alterar o time; e o padrão Command, que é basicamente um sistema de pedidos onde você diz o que precisa e alguém executa.

## Design Patterns mais comuns
Vou listar os design patterns de um jeito bem resumido e colocar links para artigos mais detalhados sobre cada um deles, assim deixo o artigo mais direto e consigo detalhes mais tecnicamente em cada um dos links :D

### Singleton
Esse padrão é o rei da exclusividade! Ele garante que só exista uma única instância de uma classe e ainda por cima oferece um ponto de acesso global a ela. 
É super útil quando você quer ter uma única instância compartilhada de uma classe por toda a aplicação, tipo aquele amigo que todo mundo conhece e adora!

{% embed https://dev.to/rflpazini/singleton-design-pattern-1n51 %}

### Factory
Esse padrão é como o anfitrião de uma festa que diz: "Pode entrar, escolha seu quarto!". 
Ele oferece uma interface para criar objetos, mas deixa as subclasses decidirem qual classe elas querem instanciar. É mega útil quando você quer tirar a preocupação de saber exatamente qual classe vai ser usada na criação de objetos, deixando o processo mais livre e criativo, como escolher o sabor da pizza numa noite de jogos sem se preocupar com a pizzaria!

{% embed https://dev.to/rflpazini/factory-design-pattern-4e9n %}

### Builder
Esse padrão é tipo um chef de cozinha que te dá a receita, mas deixa você decidir quais ingredientes usar. Ele oferece uma interface para criar objetos, mas permite que as subclasses decidam qual classe instanciar. É super útil quando você quer abstrair o processo de criação de objetos e criar coisas sem ter que especificar exatamente qual classe usar.

{% embed https://dev.to/rflpazini/builder-design-pattern-2hm3 %}

### Adapter
Esse padrão é tipo um adaptador de tomada! Ele permite que interfaces incompatíveis de diferentes classes funcionem juntas, envolvendo uma classe com outra. Funciona como uma ponte entre duas interfaces, convertendo a interface de uma classe em outra que os clientes esperam. É como usar um adaptador para conectar seu carregador de celular em qualquer lugar do mundo, garantindo que tudo funcione direitinho!

### Strategy
Esse padrão é tipo um cardápio de receitas! Ele define uma família de algoritmos intercambiáveis e encapsula cada um em classes separadas. Isso permite que você escolha o algoritmo na hora, com base em condições ou requisitos específicos. É como poder escolher a receita perfeita para cada ocasião, dependendo do que você tem na geladeira!

### Facade
Esse padrão é tipo um controle remoto universal! Ele fornece uma interface única para um conjunto de interfaces em um subsistema. Simplifica o uso de sistemas complexos ao oferecer uma interface de alto nível que esconde toda a complexidade por trás. É como usar um controle remoto para comandar todos os seus aparelhos eletrônicos sem precisar mexer em cada um individualmente!