<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Joao Gabriel</title>
    <description>The latest articles on DEV Community by Joao Gabriel (@joao_gabriel_1c2754f36889).</description>
    <link>https://dev.to/joao_gabriel_1c2754f36889</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4119659%2Fff9aad22-6992-4b60-902f-eef27630604b.png</url>
      <title>DEV Community: Joao Gabriel</title>
      <link>https://dev.to/joao_gabriel_1c2754f36889</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/joao_gabriel_1c2754f36889"/>
    <language>en</language>
    <item>
      <title># Design Patterns: como padrões de projeto ajudam a criar códigos mais organizados e flexíveis</title>
      <dc:creator>Joao Gabriel</dc:creator>
      <pubDate>Thu, 10 Sep 2026 16:34:09 +0000</pubDate>
      <link>https://dev.to/joao_gabriel_1c2754f36889/-design-patterns-como-padroes-de-projeto-ajudam-a-criar-codigos-mais-organizados-e-flexiveis-4mb0</link>
      <guid>https://dev.to/joao_gabriel_1c2754f36889/-design-patterns-como-padroes-de-projeto-ajudam-a-criar-codigos-mais-organizados-e-flexiveis-4mb0</guid>
      <description>&lt;p&gt;Durante o desenvolvimento de software, é muito comum encontrarmos problemas que parecem diferentes, mas que na verdade possuem soluções bastante parecidas.&lt;/p&gt;

&lt;p&gt;Com o tempo, desenvolvedores perceberam que algumas dessas soluções poderiam ser organizadas e documentadas para serem reutilizadas em diferentes projetos. Foi assim que surgiu o conceito de &lt;strong&gt;Design Patterns&lt;/strong&gt;, ou &lt;strong&gt;Padrões de Projeto&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Neste artigo, vou apresentar o conceito de Design Patterns, suas principais categorias e alguns exemplos utilizando &lt;strong&gt;Java&lt;/strong&gt;, mostrando como esses padrões podem ajudar no desenvolvimento de sistemas mais organizados, reutilizáveis e fáceis de manter.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que são Design Patterns?
&lt;/h2&gt;

&lt;p&gt;Design Patterns são &lt;strong&gt;soluções reutilizáveis para problemas recorrentes no desenvolvimento de software&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Isso não significa que um Design Pattern seja simplesmente um código pronto para copiar e colar. Na verdade, ele representa uma &lt;strong&gt;forma de estruturar as classes e os objetos&lt;/strong&gt; para resolver determinado tipo de problema.&lt;/p&gt;

&lt;p&gt;Uma maneira simples de entender é pensar em uma receita.&lt;/p&gt;

&lt;p&gt;Uma receita não é a comida pronta. Ela apresenta uma sequência de ideias e passos que podem ser utilizados para preparar determinado prato.&lt;/p&gt;

&lt;p&gt;Da mesma forma, um Design Pattern não é um programa completo. Ele apresenta uma solução que pode ser adaptada às necessidades de um projeto.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Design Pattern não é uma biblioteca ou framework. É uma estratégia de organização do código.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Por que utilizar Design Patterns?
&lt;/h2&gt;

&lt;p&gt;Um dos principais benefícios dos padrões de projeto é ajudar o desenvolvedor a evitar soluções improvisadas para problemas que já são conhecidos.&lt;/p&gt;

&lt;p&gt;Entre os principais benefícios estão:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reutilização de soluções&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maior organização do código&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Facilidade de manutenção&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maior flexibilidade&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Redução do acoplamento entre classes&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Facilidade para trabalhar em equipe&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comunicação mais clara entre desenvolvedores&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por exemplo, quando um desenvolvedor fala que determinada parte do sistema utiliza o padrão &lt;strong&gt;Observer&lt;/strong&gt;, outro desenvolvedor que conhece esse padrão já consegue ter uma ideia de como aquela estrutura funciona.&lt;/p&gt;

&lt;p&gt;Isso facilita bastante a comunicação dentro de uma equipe.&lt;/p&gt;

&lt;h1&gt;
  
  
  Categorias dos Design Patterns
&lt;/h1&gt;

&lt;p&gt;Os Design Patterns mais conhecidos podem ser divididos em três grandes categorias:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Criacionais
&lt;/h3&gt;

&lt;p&gt;Os padrões criacionais estão relacionados à &lt;strong&gt;criação de objetos&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Alguns exemplos são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Singleton&lt;/li&gt;
&lt;li&gt;Factory Method&lt;/li&gt;
&lt;li&gt;Abstract Factory&lt;/li&gt;
&lt;li&gt;Builder&lt;/li&gt;
&lt;li&gt;Prototype&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eles são úteis principalmente quando a criação de objetos precisa seguir determinadas regras ou quando queremos evitar que o código fique fortemente dependente de classes específicas.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Estruturais
&lt;/h3&gt;

&lt;p&gt;Os padrões estruturais estão relacionados à &lt;strong&gt;organização e composição das classes e objetos&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Entre eles podemos citar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adapter&lt;/li&gt;
&lt;li&gt;Decorator&lt;/li&gt;
&lt;li&gt;Facade&lt;/li&gt;
&lt;li&gt;Composite&lt;/li&gt;
&lt;li&gt;Proxy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eles ajudam a organizar relacionamentos entre diferentes partes do sistema.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Comportamentais
&lt;/h3&gt;

&lt;p&gt;Os padrões comportamentais estão relacionados à &lt;strong&gt;comunicação e distribuição de responsabilidades entre objetos&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Alguns exemplos são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Observer&lt;/li&gt;
&lt;li&gt;Strategy&lt;/li&gt;
&lt;li&gt;Command&lt;/li&gt;
&lt;li&gt;State&lt;/li&gt;
&lt;li&gt;Iterator&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eles são especialmente úteis quando existem diferentes comportamentos que precisam ser organizados de maneira flexível.&lt;/p&gt;

&lt;h1&gt;
  
  
  Exemplo 1: Singleton
&lt;/h1&gt;

&lt;p&gt;O &lt;strong&gt;Singleton&lt;/strong&gt; é um padrão criacional utilizado quando precisamos garantir que determinada classe tenha apenas &lt;strong&gt;uma instância&lt;/strong&gt; durante a execução da aplicação.&lt;/p&gt;

&lt;p&gt;Um exemplo clássico é uma classe responsável por armazenar configurações de uma aplicação.&lt;/p&gt;

&lt;p&gt;Um exemplo simplificado seria:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Configuracao&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;Configuracao&lt;/span&gt; &lt;span class="n"&gt;instancia&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;Configuracao&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;Configuracao&lt;/span&gt; &lt;span class="nf"&gt;getInstancia&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instancia&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;instancia&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Configuracao&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;instancia&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora podemos obter a instância da classe dessa forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Configuracao&lt;/span&gt; &lt;span class="n"&gt;config1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Configuracao&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInstancia&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="nc"&gt;Configuracao&lt;/span&gt; &lt;span class="n"&gt;config2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Configuracao&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInstancia&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config1&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;config2&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O resultado será:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso acontece porque &lt;code&gt;config1&lt;/code&gt; e &lt;code&gt;config2&lt;/code&gt; apontam para a mesma instância.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quando utilizar?
&lt;/h3&gt;

&lt;p&gt;O Singleton pode ser interessante quando realmente precisamos controlar a quantidade de instâncias de determinado recurso.&lt;/p&gt;

&lt;p&gt;Porém, é importante não utilizar o padrão simplesmente porque ele parece conveniente. Em algumas situações, o Singleton pode aumentar o acoplamento do sistema e dificultar testes.&lt;/p&gt;

&lt;h1&gt;
  
  
  Exemplo 2: Factory Method
&lt;/h1&gt;

&lt;p&gt;Outro padrão bastante conhecido é o &lt;strong&gt;Factory Method&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A ideia principal é separar a criação de um objeto da utilização desse objeto.&lt;/p&gt;

&lt;p&gt;Imagine um sistema que precisa trabalhar com diferentes tipos de notificações.&lt;/p&gt;

&lt;p&gt;Podemos criar uma interface:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Notificacao&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;enviar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;mensagem&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois podemos criar diferentes implementações:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EmailNotificacao&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Notificacao&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;enviar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;mensagem&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Enviando e-mail: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;mensagem&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E também:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SmsNotificacao&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Notificacao&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;enviar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;mensagem&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Enviando SMS: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;mensagem&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uma fábrica pode ser responsável por criar o tipo correto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NotificacaoFactory&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;Notificacao&lt;/span&gt; &lt;span class="nf"&gt;criar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;tipo&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tipo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equalsIgnoreCase&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;EmailNotificacao&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tipo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equalsIgnoreCase&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"sms"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SmsNotificacao&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
            &lt;span class="s"&gt;"Tipo de notificação inválido"&lt;/span&gt;
        &lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Assim, o código que utiliza a notificação não precisa conhecer diretamente todos os detalhes de criação.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Notificacao&lt;/span&gt; &lt;span class="n"&gt;notificacao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
        &lt;span class="nc"&gt;NotificacaoFactory&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;criar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;notificacao&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;enviar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Olá, usuário!"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse tipo de abordagem pode deixar o sistema mais flexível quando novos tipos de objetos precisam ser adicionados.&lt;/p&gt;

&lt;h1&gt;
  
  
  Exemplo 3: Strategy
&lt;/h1&gt;

&lt;p&gt;O padrão &lt;strong&gt;Strategy&lt;/strong&gt; é um dos meus exemplos favoritos porque mostra bem como podemos evitar vários &lt;code&gt;if&lt;/code&gt; e &lt;code&gt;else&lt;/code&gt; espalhados pelo sistema.&lt;/p&gt;

&lt;p&gt;Imagine um sistema de pagamento que pode trabalhar com diferentes formas de pagamento:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pix&lt;/li&gt;
&lt;li&gt;Cartão&lt;/li&gt;
&lt;li&gt;Boleto&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Primeiro podemos definir uma interface:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;FormaPagamento&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;pagar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois criamos as estratégias:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PagamentoPix&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;FormaPagamento&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;pagar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
            &lt;span class="s"&gt;"Pagamento de R$ "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" realizado via Pix."&lt;/span&gt;
        &lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Outra implementação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PagamentoCartao&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;FormaPagamento&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;pagar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
            &lt;span class="s"&gt;"Pagamento de R$ "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" realizado via cartão."&lt;/span&gt;
        &lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora podemos criar uma classe responsável por utilizar qualquer estratégia:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Pagamento&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;FormaPagamento&lt;/span&gt; &lt;span class="n"&gt;formaPagamento&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Pagamento&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;FormaPagamento&lt;/span&gt; &lt;span class="n"&gt;formaPagamento&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;formaPagamento&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;formaPagamento&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;realizar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;formaPagamento&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pagar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podemos então escolher a estratégia no momento da utilização:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;FormaPagamento&lt;/span&gt; &lt;span class="n"&gt;pix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;PagamentoPix&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;span class="nc"&gt;Pagamento&lt;/span&gt; &lt;span class="n"&gt;pagamento&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Pagamento&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pix&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;pagamento&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;realizar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;100.00&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se amanhã o sistema precisar aceitar outro tipo de pagamento, podemos criar uma nova implementação da interface sem precisar modificar toda a estrutura existente.&lt;/p&gt;

&lt;p&gt;Essa é uma das grandes vantagens do padrão Strategy.&lt;/p&gt;

&lt;h1&gt;
  
  
  Exemplo 4: Observer
&lt;/h1&gt;

&lt;p&gt;O &lt;strong&gt;Observer&lt;/strong&gt; é um padrão comportamental utilizado quando um objeto precisa &lt;strong&gt;notificar outros objetos sobre alterações em seu estado&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Um exemplo bastante conhecido é o sistema de notificações.&lt;/p&gt;

&lt;p&gt;Imagine que um pedido seja criado em uma loja virtual. Depois que o pedido é criado, diferentes partes do sistema podem precisar ser avisadas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;serviço de e-mail;&lt;/li&gt;
&lt;li&gt;serviço de estoque;&lt;/li&gt;
&lt;li&gt;serviço de pagamento;&lt;/li&gt;
&lt;li&gt;serviço de entrega.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em vez de fazer o pedido conhecer diretamente todos esses serviços, podemos utilizar uma estrutura baseada em observadores.&lt;/p&gt;

&lt;p&gt;Uma interface poderia ser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Observador&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;atualizar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;mensagem&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Um observador específico:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EmailService&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Observador&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;atualizar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;mensagem&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
            &lt;span class="s"&gt;"E-mail enviado: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;mensagem&lt;/span&gt;
        &lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Outro observador:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EstoqueService&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Observador&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;atualizar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;mensagem&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
            &lt;span class="s"&gt;"Estoque atualizado: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;mensagem&lt;/span&gt;
        &lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando um evento acontece, os observadores podem ser notificados.&lt;/p&gt;

&lt;p&gt;Essa ideia é muito utilizada em sistemas que precisam reagir a eventos sem criar um forte acoplamento entre os componentes.&lt;/p&gt;

&lt;h1&gt;
  
  
  Design Patterns e orientação a objetos
&lt;/h1&gt;

&lt;p&gt;Uma das razões pelas quais Design Patterns são tão importantes é a relação com os princípios da &lt;strong&gt;programação orientada a objetos&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Conceitos como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;encapsulamento;&lt;/li&gt;
&lt;li&gt;abstração;&lt;/li&gt;
&lt;li&gt;herança;&lt;/li&gt;
&lt;li&gt;polimorfismo;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;aparecem frequentemente na implementação dos padrões.&lt;/p&gt;

&lt;p&gt;Além disso, muitos padrões ajudam a aplicar princípios de projeto, como o &lt;strong&gt;SOLID&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Por exemplo, ao utilizar interfaces e separar responsabilidades, podemos tornar o sistema mais fácil de modificar sem precisar alterar várias classes ao mesmo tempo.&lt;/p&gt;

&lt;h1&gt;
  
  
  Quando não utilizar um Design Pattern?
&lt;/h1&gt;

&lt;p&gt;Uma coisa importante que aprendi estudando padrões de projeto é que &lt;strong&gt;nem todo problema precisa de um Design Pattern&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;É possível exagerar na utilização desses padrões.&lt;/p&gt;

&lt;p&gt;Se um problema é simples e pode ser resolvido de maneira clara com poucas classes, adicionar várias abstrações apenas para dizer que estamos utilizando um padrão pode deixar o código mais difícil de entender.&lt;/p&gt;

&lt;p&gt;Por isso, antes de utilizar um padrão, é importante perguntar:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Esse padrão realmente resolve um problema que existe no meu sistema?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Se a resposta for não, provavelmente ele não é necessário.&lt;/p&gt;

&lt;p&gt;O objetivo não deve ser utilizar o maior número possível de Design Patterns, mas sim &lt;strong&gt;utilizar a solução adequada para cada situação&lt;/strong&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusão
&lt;/h1&gt;

&lt;p&gt;Design Patterns são uma ferramenta importante para quem trabalha com desenvolvimento de software.&lt;/p&gt;

&lt;p&gt;Eles não fornecem uma solução pronta para todos os problemas, mas apresentam maneiras já conhecidas de organizar o código e resolver situações recorrentes.&lt;/p&gt;

&lt;p&gt;Neste artigo vimos alguns exemplos:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Padrão&lt;/th&gt;
&lt;th&gt;Categoria&lt;/th&gt;
&lt;th&gt;Principal objetivo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Singleton&lt;/td&gt;
&lt;td&gt;Criacional&lt;/td&gt;
&lt;td&gt;Controlar a criação de uma única instância&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Factory&lt;/td&gt;
&lt;td&gt;Criacional&lt;/td&gt;
&lt;td&gt;Centralizar ou abstrair a criação de objetos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Strategy&lt;/td&gt;
&lt;td&gt;Comportamental&lt;/td&gt;
&lt;td&gt;Permitir diferentes estratégias de comportamento&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Observer&lt;/td&gt;
&lt;td&gt;Comportamental&lt;/td&gt;
&lt;td&gt;Notificar objetos quando determinado evento acontece&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;O mais importante é entender que &lt;strong&gt;Design Patterns não existem para deixar o código mais complicado ou mais sofisticado&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Eles existem para ajudar a criar sistemas que possam evoluir com menos dificuldade.&lt;/p&gt;

&lt;p&gt;À medida que começamos a reconhecer problemas recorrentes no desenvolvimento, os padrões de projeto passam a ser menos uma "receita decorada" e mais uma forma de pensar na arquitetura e na organização do software.&lt;/p&gt;

&lt;p&gt;No fim das contas, conhecer Design Patterns não significa saber todos os padrões de memória. Significa saber &lt;strong&gt;identificar um problema, conhecer possíveis soluções e escolher a alternativa mais adequada para aquele contexto&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Referências
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gamma, Erich; Helm, Richard; Johnson, Ralph; Vlissides, John. &lt;em&gt;Design Patterns: Elements of Reusable Object-Oriented Software&lt;/em&gt;. Addison-Wesley.&lt;/li&gt;
&lt;li&gt;Freeman, Eric; Robson, Elisabeth. &lt;em&gt;Head First Design Patterns&lt;/em&gt;. O'Reilly Media.&lt;/li&gt;
&lt;li&gt;Documentação oficial da linguagem Java.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tags sugeridas no Dev.to:&lt;/strong&gt; &lt;code&gt;java&lt;/code&gt;, &lt;code&gt;designpatterns&lt;/code&gt;, &lt;code&gt;programming&lt;/code&gt;, &lt;code&gt;beginners&lt;/code&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>java</category>
      <category>programming</category>
      <category>softwareengineering</category>
    </item>
  </channel>
</rss>
