{"componentChunkName":"component---src-templates-blog-post-js","path":"/factory-strategy/","result":{"data":{"markdownRemark":{"html":"<h2 id=\"Introducao-Design-Patterns\" style=\"position:relative;\">Introdução Design Patterns<a href=\"#Introducao-Design-Patterns\" aria-label=\"Introducao Design Patterns permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Padrões de projeto são formas mais padronizadas para solucionar problemas em comum…\n<img src=\"/static/assets//0015bef4ac075fdd0a02c5f43d7b7948/confuso.gif\" alt=\"confuso\"></p>\n<p>Ok tentando ser mais claro; quando precisamos organizar o nosso código, deixá-lo flexível às mudanças, adaptável e reutilizável podemos seguir dois caminhos:</p>\n<ul>\n<li>1°: Podemos fazer tudo na unha e criar a nossa própria forma de fazer as coisas e quem ver esse código que entenda ou leia alguma documentação se houver.</li>\n<li>2°: Podemos usar um jeito que outras empresas já fizeram, testaram e validaram seus prós e contras.</li>\n</ul>\n<p>Pensando assim nasceram os padrões de projeto (Design Patterns).\nA idéia de padrões de projetos não é nova (anos 70), já que na maioria das vezes os problemas são muito parecidos, mas em 1995 é que essa ideia se tornou mais tangível com o livro Design Patterns: Elements of Reusable Object-Oriented Software (Padrões de Projetos: Soluções Reutilizáveis de Software Orientados a Objetos) onde eram catálogados e descritos.\nForam divididos em três grupos de padrões:</p>\n<ul>\n<li>Criacionais (criação de objetos de forma eficiente, reutilizável e flexível)</li>\n<li>Estruturais (como organizar a montagem de objetos para estruturas maiores)</li>\n<li>Comportamentais (comunicação, responsabilidade e execução)</li>\n</ul>\n<p>Com isso foram catálogados 23 padrões que ficaram conhecidos como padrões GoF, Gang of Four, uma referência aos criadores do livro, Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides.</p>\n<h2 id=\"Projeto-pratico\" style=\"position:relative;\">Projeto prático<a href=\"#Projeto-pratico\" aria-label=\"Projeto pratico permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Vamos fazer um projeto prático, a intenção aqui não será abordar todos os padrões mas sim como podemos analisar um problema e definir qual padrão poderia ser usado.</p>\n<h2 id=\"Problema\" style=\"position:relative;\">Problema<a href=\"#Problema\" aria-label=\"Problema permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Vamos pensar que temos uma aplicação que recebe o nome de uma cerveja e a partir disso deve executar algo para cada tipo de cerveja. Como poderíamos resolver isso? Acho que a solução de primeira e mais simples poderia ser um <code class=\"language-text\">if/else</code> assim:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>cerveja<span class=\"token punctuation\">.</span><span class=\"token function\">getName</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span> <span class=\"token string\">\"IPA\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">//faça algo</span>\n<span class=\"token punctuation\">}</span><span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">//faça outra coisa</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Essa implementação parece ser razoável a primeira vista mas aqui temos um problema que pode ser considerado, e se amanhã surgir outro tipo de cerveja? Ou se eu tiver um catálogo com mais de 100 tipos de cervejas? Vou colocar mais um <code class=\"language-text\">if</code> ou então vou substituir por um block <code class=\"language-text\">switch case</code>? As duas abordagens na verdade mascaram o mesmo problema que é o problema de sua implementação poder crescer infinitamente. Isso gera um código gigante, difícil de dar manutenção e difícil de entender e ainda mais existe um princípio que esse tipo de implementação fere que é o princípio Open/Close (Aberto/Fechado) do S.O.L.I.D. que diz: <em>“entidades de software (classes, módulos, funções, etc.) devem ser abertas para extensão, mas fechadas para modificação”</em>.\nTrocando em miúdos isso quer dizer que você ter várias extensões de uma interface, classe e etc. sem mudar nada neles. Mas como trazer isso pro nosso caso?</p>\n<h2 id=\"Strategy\" style=\"position:relative;\">Strategy<a href=\"#Strategy\" aria-label=\"Strategy permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Aqui veremos o primeiro padrão de projeto que pode resolver essa situação. O padrão <strong>Strategy</strong> é um padrão comportamental, isso quer dizer que usando ele você pode definir comportamentos diferentes dependendo do que for passado, isso casa bem com o esse problema mas como implementar?\nA primeira coisa que vamos fazer é criar uma interface que represente pra nós a nossa ação, vou criar com o nome <strong>Beer</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">package</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>example<span class=\"token punctuation\">.</span>demo<span class=\"token punctuation\">.</span>beer</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">interface</span> <span class=\"token class-name\">Beer</span> <span class=\"token punctuation\">{</span>\n\t\n\t<span class=\"token keyword\">void</span> <span class=\"token function\">drink</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\n\t<span class=\"token class-name\">String</span> <span class=\"token function\">label</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Então aqui temos o contrato (interface) do que eu quero que toda cerveja tenha, quero que ela tenha a ação de <em>drink</em> e que ela tenha um rótulo <em>label</em>, essa parte da <em>label</em> vai ficar mais claro daqui a pouco.\nE agora eu vou implementar as nossa cervejas vou criar três tipos aqui, IPA, ALE e STOUT todas vão seguir esse mesmo exemplo:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Ale</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">Beer</span><span class=\"token punctuation\">{</span>\n\n\t<span class=\"token annotation punctuation\">@Override</span>\n\t<span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">drink</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Drink a ale beer\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n\t<span class=\"token annotation punctuation\">@Override</span>\n\t<span class=\"token keyword\">public</span> <span class=\"token class-name\">String</span> <span class=\"token function\">label</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">return</span> <span class=\"token string\">\"Ale\"</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Com isso se eu já instânciar qualquer cerveja ele já vai ser capaz de chamar a implementação correta mais ou menos assim:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Test</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">callCorrectBeer</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">Beer</span> beer <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Ale</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        beer<span class=\"token punctuation\">.</span><span class=\"token function\">drink</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Isso já ajuda bastante por que imaginando que eu tenho um dado de entrada para a minha aplicação eu poderia fazer algo assim:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Main</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">void</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span> args<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">//dado de entrada</span>\n        <span class=\"token class-name\">String</span> beerAle <span class=\"token operator\">=</span> <span class=\"token string\">\"Ale\"</span><span class=\"token punctuation\">;</span>\n        \n        <span class=\"token class-name\">Beer</span> beer <span class=\"token operator\">=</span> <span class=\"token comment\">//de alguma forma eu descobrir que se trata de uma Ale</span>\n        beer<span class=\"token punctuation\">.</span><span class=\"token function\">drink</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Se eu mudar o tipo pra STOUT por exemplo o que mudaria é comportamento mas fica transparente pra quem está chamando.</p>\n<h2 id=\"Factory\" style=\"position:relative;\">Factory<a href=\"#Factory\" aria-label=\"Factory permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Precisamos agora ter um jeito de saber qual é a cerveja que eu quero criar para chamar a nossa <strong>Strategy</strong> certa. Um jeito é tendo uma classe que tenha como especialidade criar instâncias de Beer corretas, é um <em>factory</em> (fábrica) que irá se preocupar em criar as instâncias corretas pra nós.\nEsse padrão entra como sendo um padrão criacional, a única preocupação dele é criar objetos de forma correta pra gente, vamos fazer com que seja o mais genérico possível, então antes vamos criar uma <em>interface</em> que vai ser responsável por criar objetos pra gente se baseando no tipo que vamos passar pra ele:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">package</span> <span class=\"token namespace\">com<span class=\"token punctuation\">.</span>example<span class=\"token punctuation\">.</span>demo<span class=\"token punctuation\">.</span>beer<span class=\"token punctuation\">.</span>factory</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">interface</span> <span class=\"token class-name\">AbstractFactory</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">T</span><span class=\"token punctuation\">></span></span> <span class=\"token punctuation\">{</span>\n\t\n\t<span class=\"token class-name\">T</span> <span class=\"token function\">create</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> type<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Aqui usamos o recurso de <em>Generics</em> do Java pra deixar o mais genérico possível, então a nossa interface receberá o tipo terá o método <em>create</em> que devolve pra gente esse tipo definido.\nE agora vamos fazer a implementação dessa factory:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">FactoryBeer</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">AbstractFactory</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Beer</span><span class=\"token punctuation\">></span></span> <span class=\"token punctuation\">{</span>\n\t\n\t<span class=\"token annotation punctuation\">@Override</span>\n\t<span class=\"token keyword\">public</span> <span class=\"token class-name\">Beer</span> <span class=\"token function\">create</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> type<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n        <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>type <span class=\"token operator\">==</span> <span class=\"token string\">\"Ale\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Ale</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span><span class=\"token keyword\">if</span> <span class=\"token keyword\">else</span><span class=\"token punctuation\">(</span>type <span class=\"token operator\">==</span> <span class=\"token string\">\"Stout\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Stout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span><span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">return</span> <span class=\"token class-name\">Ipa</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\t<span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Aqui pode parecer que demos uma grande volta pra cair num <code class=\"language-text\">if/else</code> de novo mas na verdade estamos deixando em um único ponto, que é na nossa classe especializada em fabricar objetos, mas podemos melhorar isso, nesse projeto eu uso <strong>Spring Boot</strong> e ele trabalha com o conceito de IoC (Inversão de Controle) e nos fornece uma interface que é a <strong>ApplicationContext</strong> que gerencia os nossos <strong>Beans</strong>, pra não entrar muito dentro dos detalhes a grosso modo tudo o que usar as annotations <code class=\"language-text\">@Bean</code>, <code class=\"language-text\">@Component</code>, <code class=\"language-text\">@Controller</code>, <code class=\"language-text\">@Service</code>, <code class=\"language-text\">@Repository</code>, <code class=\"language-text\">@Autowired</code>, e <code class=\"language-text\">@Qualifier</code> serão objetos que o Spring vai gerenciar e ele é que vai decidir quando eles estarão disponíveis pra uso. Então depois de toda essa explicação é pra dizer que podemos então delegar essa responsabilidade pro <strong>ApplicationContext</strong> pra gente assim:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Component</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">FactoryBeer</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">AbstractFactory</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Beer</span><span class=\"token punctuation\">></span></span> <span class=\"token punctuation\">{</span>\n\t\n\t<span class=\"token annotation punctuation\">@Autowired</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">ApplicationContext</span> context<span class=\"token punctuation\">;</span>\n\n\t<span class=\"token annotation punctuation\">@Override</span>\n\t<span class=\"token keyword\">public</span> <span class=\"token class-name\">Beer</span> <span class=\"token function\">create</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> type<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\n\t\t<span class=\"token keyword\">return</span> context<span class=\"token punctuation\">.</span><span class=\"token function\">getBean</span><span class=\"token punctuation\">(</span>type<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>O que muda aqui é que adicionamos a anotação <code class=\"language-text\">@Component</code> e isso faz com que automaticamente o Spring comece a gerenciar a injeção das nossas dependências, injetamos com a anotação <code class=\"language-text\">@Autowired</code> a nossa interface <strong>ApplicationContext</strong> e no nosso método chamamos o <em>getBean</em> e ele vai trazer pra gente a instância certa. Só tem um problema aqui, caso seja passada uma String <em>type</em> errada que não exista ele vai lançar uma <strong>BeansException</strong>, inclusive o próprio método <em>getBean</em> faz parte da API da interface <strong>BeanFactory</strong> que é fábrica de <strong>Beans</strong> do Spring.\nVamos então criar um jeito onde eu passe um tipo que existe e ele irá chamar o tipo existente, vamos criar uma enumeração <em>Enum</em> onde conseguimos registrar as nossas classes de serviço e um método de busca:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">enum</span> <span class=\"token class-name\">BeerType</span> <span class=\"token punctuation\">{</span>\n\t\n\t<span class=\"token function\">ALE</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Ale\"</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">Ale</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n\t<span class=\"token function\">IPA</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Ipa\"</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">Ipa</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n\t<span class=\"token function\">STOUT</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Stout\"</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">Stout</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> name<span class=\"token punctuation\">;</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">Class</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token operator\">?</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Beer</span><span class=\"token punctuation\">></span></span> type<span class=\"token punctuation\">;</span>\n\t\n\t<span class=\"token class-name\">BeerType</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> name<span class=\"token punctuation\">,</span> <span class=\"token class-name\">Class</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token operator\">?</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Beer</span><span class=\"token punctuation\">></span></span> type<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>name <span class=\"token operator\">=</span> name<span class=\"token punctuation\">;</span>\n\t\t<span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>type <span class=\"token operator\">=</span> type<span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\t\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token class-name\">BeerType</span> <span class=\"token function\">of</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> value<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n        <span class=\"token keyword\">return</span> <span class=\"token class-name\">Arrays</span><span class=\"token punctuation\">.</span><span class=\"token function\">stream</span><span class=\"token punctuation\">(</span><span class=\"token function\">values</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">filter</span><span class=\"token punctuation\">(</span>type <span class=\"token operator\">-></span> type<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">.</span><span class=\"token function\">equalsIgnoreCase</span><span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">findFirst</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\t\n\t<span class=\"token keyword\">public</span> <span class=\"token class-name\">String</span> <span class=\"token function\">getName</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">return</span> name<span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\t\n\t<span class=\"token keyword\">public</span> <span class=\"token class-name\">Class</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token operator\">?</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Beer</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">getType</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">return</span> type<span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Um ponto muito importante é que as nossas três classes de serviço devem ser anotadas com algumas das anotações citadas anteriormente para gerenciamento do Spring, no caso iremos anotar com <code class=\"language-text\">@Component</code> para ficar mais semântico.\nEntão o resultado final da nossa factory ficaria assim:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Component</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">FactoryBeer</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">AbstractFactory</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Beer</span><span class=\"token punctuation\">></span></span> <span class=\"token punctuation\">{</span>\n\t\n\t<span class=\"token annotation punctuation\">@Autowired</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">ApplicationContext</span> context<span class=\"token punctuation\">;</span>\n\n\t<span class=\"token annotation punctuation\">@Override</span>\n\t<span class=\"token keyword\">public</span> <span class=\"token class-name\">Beer</span> <span class=\"token function\">create</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> type<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\n\t\t<span class=\"token keyword\">return</span> context<span class=\"token punctuation\">.</span><span class=\"token function\">getBean</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">BeerType</span><span class=\"token punctuation\">.</span><span class=\"token function\">of</span><span class=\"token punctuation\">(</span>type<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">getType</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"Service\" style=\"position:relative;\">Service<a href=\"#Service\" aria-label=\"Service permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Agora vamos criar a classe que vai amarrar tudo pra gente:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Service</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">BeerService</span> <span class=\"token punctuation\">{</span>\n\t\n\t<span class=\"token annotation punctuation\">@Autowired</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">AbstractFactory</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Beer</span><span class=\"token punctuation\">></span></span> factory<span class=\"token punctuation\">;</span>\n\t\n\t<span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">process</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> beer<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token class-name\">Beer</span> beerBean <span class=\"token operator\">=</span> factory<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>beer<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\tbeerBean<span class=\"token punctuation\">.</span><span class=\"token function\">drink</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Ela é só a chamada dos serviços, injetamos a nossa factory do tipo <strong>Beer</strong> e chamamos o seu <em>create</em> passando o tipo como parâmetro e depois chamamos o método <em>drink</em>.</p>\n<h2 id=\"Rodando-a-aplicacao\" style=\"position:relative;\">Rodando a aplicação<a href=\"#Rodando-a-aplicacao\" aria-label=\"Rodando a aplicacao permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Rodando a nossa aplicação na nossa <em>main</em>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@SpringBootApplication</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">DemoApplication</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">CommandLineRunner</span><span class=\"token punctuation\">{</span>\n\t\n\t<span class=\"token annotation punctuation\">@Autowired</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">BeerService</span> service<span class=\"token punctuation\">;</span>\n\n\t<span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">void</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> args<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token class-name\">SpringApplication</span><span class=\"token punctuation\">.</span><span class=\"token function\">run</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">DemoApplication</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> args<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n\t<span class=\"token annotation punctuation\">@Override</span>\n\t<span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">run</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span> args<span class=\"token punctuation\">)</span> <span class=\"token keyword\">throws</span> <span class=\"token class-name\">Exception</span> <span class=\"token punctuation\">{</span>\n\t\t\n\t\tservice<span class=\"token punctuation\">.</span><span class=\"token function\">process</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">BeerType</span><span class=\"token punctuation\">.</span>ALE<span class=\"token punctuation\">.</span><span class=\"token function\">getName</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\tservice<span class=\"token punctuation\">.</span><span class=\"token function\">process</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">BeerType</span><span class=\"token punctuation\">.</span>IPA<span class=\"token punctuation\">.</span><span class=\"token function\">getName</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\tservice<span class=\"token punctuation\">.</span><span class=\"token function\">process</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">BeerType</span><span class=\"token punctuation\">.</span>STOUT<span class=\"token punctuation\">.</span><span class=\"token function\">getName</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Temos a saída:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">Drink a ale beer\nDrink a ipa beer\nDrink a stout beer</code></pre></div>\n<h2 id=\"Finalizando\" style=\"position:relative;\">Finalizando<a href=\"#Finalizando\" aria-label=\"Finalizando permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>A decisão de usar design patterns e quais usar não é uma escolha tão fácil, leva tempo pra saber qual é o melhor caso e como combinar padrões, como por exemplo nesse projeto não foi usado explícitamente nenhum padrão estrutural mas a finalidade dos design patterns é facilitar e padronizar os nossos códigos pensando em reutilização, refatoração, manutenção e flexibilidade.\nVimos aqui alguns padrões que podem ser usados, como pôde ser visto nós temos um maior custo de desenvolvimento para criar o código da nossa aplicação porém o custo ao longo do tempo compensa pois nesse código temos maior flexibilidade caso surja uma regra nova ou precisarmos trocar alguma implementação do que já existe, então temos um código reutilizável, com menor custo de manutenção e como estamos usando um padrão de mercado caso algum dia outro desenvolvedor ou equipe precise dar suporte ou fazer alguma coisa nova não perderá tanto tempo se eles souberem os padrões ficará mais fácil o entendimento do código.\nAqui temos o <a href=\"https://github.com/guilhermegarcia86/spring-boot-abstract-factory-strategy-pattern\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">GitHub</a> do projeto.</p>","fields":{"slug":"/factory-strategy/"},"frontmatter":{"date":"14 de setembro de 2020","description":"Como utilizar Design Patterns em uma aplicação Java","title":"Usando padrões de projeto em uma aplicação","tags":["Desenvolvimento","Java","Design Patterns"],"author":"Guilherme Alves","image":{"id":"bba649ce-6ffe-59a5-9d63-b4818e862392","publicURL":"/static/d006b6950f02f08003c124d36aa491a9/design-patterns.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAAsSAAALEgHS3X78AAABr0lEQVQoz42SXU/iQBSG+dteeeON3ngjGz8SskpYNOICoqioMUbxEwE1bXClRmqBohWHlrbT6cycnRZcdWOiJycnkzPzvDPnzUTgfXAuCjOtweLLiPxHctvGxRP4XkQ+kIQ4qQwulTmlr/0v4SHp92ML/XgSn5e57394kdASyRgPK7xKhzDjDMC9kqz4ohmdJbdK0KNMSPpak/V6Q4lBfj6z5/HbuhdPekupAMNE9Ozl33j/QLjgnV9QrenX/nilCt4/ZOHTIgOtomKcqS+GTdqN9mNdFTt7Nf3BBbq27mztWjMxc3zSmpru/0y4B8doZJQ9d0M4vLWq9eZPG3mpk5E620oXE5quNlWH03QWjU2Yk1Hv8Ngcm3C3dvo/5sRoQ/ifozlJj52o86dqXtaxTy0ceGNvFBjqMccRZwK3OGcYM0LeZq5oqKohxbATF1qipMm6SShDtheIrhcgmYHsJuQKsHcEiRT8SgeLlTV4aAdwWUOr1+0NWV+5bC1Xmtmr1qasF5WnQP/uHqoSFM/gqARGF+QbuJRBaUCtDsbLm9vIIbrptpDb6NodC3/ng/4FewSbJFO/orgAAAAASUVORK5CYII=","aspectRatio":1.6842105263157894,"src":"/static/d006b6950f02f08003c124d36aa491a9/c04dc/design-patterns.png","srcSet":"/static/d006b6950f02f08003c124d36aa491a9/c67b7/design-patterns.png 320w,\n/static/d006b6950f02f08003c124d36aa491a9/c04dc/design-patterns.png 373w","sizes":"(max-width: 373px) 100vw, 373px"}}}},"timeToRead":7}},"pageContext":{"slug":"/factory-strategy/","previous":{"fields":{"slug":"/spring-feign-assincrono/"},"frontmatter":{"title":"Comunicação assíncrona com Feign","date":"08 set, 2020"}},"next":{"fields":{"slug":"/go-design-patterns/"},"frontmatter":{"title":"Padrões de projeto com GO","date":"18 set, 2020"}}}},"staticQueryHashes":["63159454"]}