{"id":4149,"date":"2023-04-18T11:44:40","date_gmt":"2023-04-18T14:44:40","guid":{"rendered":"https:\/\/elemarjr.com\/clube-de-estudos\/?p=4149"},"modified":"2023-10-21T21:40:16","modified_gmt":"2023-10-22T00:40:16","slug":"padroes-de-projeto-do-gof-solucoes-comprovadas-para-desenvolvimento-de-software","status":"publish","type":"artigos","link":"https:\/\/elemarjr.com\/clube-de-estudos\/artigos\/padroes-de-projeto-do-gof-solucoes-comprovadas-para-desenvolvimento-de-software\/","title":{"rendered":"Padr\u00f5es de Projeto do GoF: Solu\u00e7\u00f5es Comprovadas para Desenvolvimento de Software"},"content":{"rendered":"\n<p>Padr\u00f5es de projeto foram fundamentais ao longo da minha carreira, pois s\u00e3o solu\u00e7\u00f5es comprovadas para problemas comuns no desenvolvimento de software. Eles fornecem uma maneira de criar c\u00f3digo mais modular, reutiliz\u00e1vel e f\u00e1cil de manter. O grupo mais conhecido de padr\u00f5es de projeto \u00e9 o conjunto de <strong>23 padr\u00f5es<\/strong> apresentados no livro <strong><a href=\"https:\/\/www.amazon.com.br\/Design-Patterns-Elements-Reusable-Object-Oriented\/dp\/0201633612\" target=\"_blank\" rel=\"noreferrer noopener\">Design Patterns: Elements of Reusable Object-Oriented Software<\/a><\/strong>, de autoria do chamado Gang of Four (GoF) &#8211; Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides.<\/p>\n\n\n\n<p>H\u00e1 uma divis\u00e3o em tr\u00eas categorias: padr\u00f5es de cria\u00e7\u00e3o, padr\u00f5es de estrutura e padr\u00f5es de comportamento. Neste artigo, vamos explorar cada uma dessas categorias e entender como elas podem ser usadas para resolver problemas de software.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Padr\u00f5es de cria\u00e7\u00e3o<\/h2>\n\n\n\n<p>Lidam com a maneira de criar objetos, isolando o processo de cria\u00e7\u00e3o de um objeto do seu uso final. Esses padr\u00f5es incluem o padr\u00e3o <strong>Singleton<\/strong>, que garante que apenas uma \u00fanica inst\u00e2ncia de uma determinada classe seja criada e usada em todo o sistema. Outro exemplo \u00e9 o padr\u00e3o <strong>Factory Method<\/strong>, que define uma interface para criar objetos, mas permite que as subclasses decidam qual classe concreta criar.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Padr\u00f5es de estrutura<\/h2>\n\n\n\n<p>Os padr\u00f5es de estrutura atuam com a organiza\u00e7\u00e3o de classes e objetos em estruturas maiores. Esses padr\u00f5es incluem o padr\u00e3o <strong>Adapter<\/strong>, que converte a interface de uma classe em outra interface que o cliente espera. Outro exemplo \u00e9 o padr\u00e3o <strong>Facade<\/strong>, que fornece uma interface unificada para um conjunto de interfaces em um subsistema, simplificando o uso do subsistema para os clientes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Padr\u00f5es de comportamento<\/h2>\n\n\n\n<p>Agem na comunica\u00e7\u00e3o entre objetos e na distribui\u00e7\u00e3o de responsabilidades entre eles. Esses padr\u00f5es incluem o padr\u00e3o <strong>Observer<\/strong>, que define uma depend\u00eancia um-para-muitos entre objetos, de modo que quando um objeto muda de estado, todos os seus dependentes s\u00e3o notificados e atualizados automaticamente. Outro exemplo \u00e9 o padr\u00e3o <strong>Strategy<\/strong>, que define uma fam\u00edlia de algoritmos e encapsula cada um deles, permitindo que sejam intercambiados de forma transparente em tempo de execu\u00e7\u00e3o.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Exemplo de implementa\u00e7\u00e3o em C#<\/h2>\n\n\n\n<p>Para exemplificar a implementa\u00e7\u00e3o de padr\u00f5es de projeto em C#, vamos criar uma classe que usa o padr\u00e3o 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\u00f3digo seja mais flex\u00edvel e extens\u00edvel, pois novas classes podem ser adicionadas sem modificar o c\u00f3digo existente.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" style=\"font-size:.875rem;line-height:1.25rem\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0\">C#<\/span><span role=\"button\" tabindex=\"0\" data-code=\"using System;\n\n\/\/ Classe abstrata que define a interface para criar objetos\nabstract class Creator\n{\n    \/\/ O Factory Method retorna um objeto da classe Product\n    public abstract Product FactoryMethod();\n}\n\n\/\/ Classe concreta que implementa o Factory Method\nclass ConcreteCreator : Creator\n{\n    \/\/ Sobrescrevendo o Factory Method para retornar uma inst\u00e2ncia de ConcreteProduct\n    public override Product FactoryMethod()\n    {\n        return new ConcreteProduct();\n    }\n}\n\n\/\/ Classe abstrata que define a interface do objeto a ser criado\nabstract class Product\n{\n    public abstract void Operation();\n}\n\n\/\/ Classe concreta que implementa a interface do objeto a ser criado\nclass ConcreteProduct : Product\n{\n    public override void Operation()\n    {\n        Console.WriteLine(&quot;Opera\u00e7\u00e3o do ConcreteProduct&quot;);\n    }\n}\n\n\/\/ Classe de teste que cria um objeto usando o Factory Method\nclass Client\n{\n    static void Main(string[] args)\n    {\n        \/\/ Cria uma inst\u00e2ncia de ConcreteCreator\n        Creator creator = new ConcreteCreator();\n\n        \/\/ Usa o Factory Method para criar um objeto de ConcreteProduct\n        Product product = creator.FactoryMethod();\n\n        \/\/ Chama a opera\u00e7\u00e3o do objeto criado\n        product.Operation();\n    }\n}\n\n\/\/ Fonte: Chat GPT\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\"><code><span class=\"line\"><span style=\"color: #81A1C1\">using<\/span><span style=\"color: #D8DEE9FF\"> System<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\">\/\/ Classe abstrata que define a interface para criar objetos<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">abstract<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Creator<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ O Factory Method retorna um objeto da classe Product<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">abstract<\/span><span style=\"color: #D8DEE9FF\"> Product <\/span><span style=\"color: #88C0D0\">FactoryMethod<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\">\/\/ Classe concreta que implementa o Factory Method<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">ConcreteCreator<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> Creator<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ Sobrescrevendo o Factory Method para retornar uma inst\u00e2ncia de ConcreteProduct<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">override<\/span><span style=\"color: #D8DEE9FF\"> Product <\/span><span style=\"color: #88C0D0\">FactoryMethod<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">return<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">new<\/span><span style=\"color: #D8DEE9FF\"> ConcreteProduct<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\">\/\/ Classe abstrata que define a interface do objeto a ser criado<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">abstract<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Product<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">abstract<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">void<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">Operation<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\">\/\/ Classe concreta que implementa a interface do objeto a ser criado<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">ConcreteProduct<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> Product<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">override<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">void<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">Operation<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">Console<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">WriteLine<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Opera\u00e7\u00e3o do ConcreteProduct<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\">\/\/ Classe de teste que cria um objeto usando o Factory Method<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Client<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">static<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">void<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">Main<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #81A1C1\">string<\/span><span style=\"color: #ECEFF4\">[]<\/span><span style=\"color: #D8DEE9FF\"> args<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">        <\/span><span style=\"color: #616E88\">\/\/ Cria uma inst\u00e2ncia de ConcreteCreator<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        Creator creator <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">new<\/span><span style=\"color: #D8DEE9FF\"> ConcreteCreator<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">        <\/span><span style=\"color: #616E88\">\/\/ Usa o Factory Method para criar um objeto de ConcreteProduct<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        Product product <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">creator<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">FactoryMethod<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">        <\/span><span style=\"color: #616E88\">\/\/ Chama a opera\u00e7\u00e3o do objeto criado<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">product<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">Operation<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\">\/\/ Fonte: Chat GPT<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Neste exemplo, a classe abstrata <code>Creator<\/code> define a interface para criar objetos, enquanto a classe concreta <code>ConcreteCreator<\/code> implementa o Factory Method para criar objetos da classe <code>ConcreteProduct<\/code>. A classe abstrata <code>Product<\/code> define a interface do objeto a ser criado, enquanto a classe concreta <code>ConcreteProduct<\/code> implementa a interface do objeto a ser criado. Por fim, a classe de teste <code>Client<\/code> usa o Factory Method para criar um objeto de <code>ConcreteProduct<\/code> e chama a opera\u00e7\u00e3o do objeto criado.<\/p>\n\n\n\n<p>Esse \u00e9 apenas um exemplo simples que utiliza o padr\u00e3o Factory Method. Existem muitos outros padr\u00f5es de projeto que podem ser aplicados em diferentes situa\u00e7\u00f5es para melhorar a estrutura e a organiza\u00e7\u00e3o do c\u00f3digo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Exemplo de implementa\u00e7\u00e3o em Java<\/h2>\n\n\n\n<p>Confira o c\u00f3digo em Java equivalente ao c\u00f3digo em C# que implementa o padr\u00e3o Factory Method:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" style=\"font-size:.875rem;line-height:1.25rem\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0\">Java<\/span><span role=\"button\" tabindex=\"0\" data-code=\"import java.util.*;\n\n\/\/ Classe abstrata que define a interface para criar objetos\nabstract class Creator {\n    \/\/ O Factory Method retorna um objeto da classe Product\n    public abstract Product factoryMethod();\n}\n\n\/\/ Classe concreta que implementa o Factory Method\nclass ConcreteCreator extends Creator {\n    \/\/ Sobrescrevendo o Factory Method para retornar uma inst\u00e2ncia de ConcreteProduct\n    public Product factoryMethod() {\n        return new ConcreteProduct();\n    }\n}\n\n\/\/ Classe abstrata que define a interface do objeto a ser criado\nabstract class Product {\n    public abstract void operation();\n}\n\n\/\/ Classe concreta que implementa a interface do objeto a ser criado\nclass ConcreteProduct extends Product {\n    public void operation() {\n        System.out.println(&quot;Opera\u00e7\u00e3o do ConcreteProduct&quot;);\n    }\n}\n\n\/\/ Classe de teste que cria um objeto usando o Factory Method\npublic class Main {\n    public static void main(String[] args) {\n        \/\/ Cria uma inst\u00e2ncia de ConcreteCreator\n        Creator creator = new ConcreteCreator();\n\n        \/\/ Usa o Factory Method para criar um objeto de ConcreteProduct\n        Product product = creator.factoryMethod();\n\n        \/\/ Chama a opera\u00e7\u00e3o do objeto criado\n        product.operation();\n    }\n}\n\n\/\/ Fonte: Chat GPT\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\"><code><span class=\"line\"><span style=\"color: #81A1C1\">import<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">java<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #8FBCBB\">util<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #81A1C1\">*;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\">\/\/ Classe abstrata que define a interface para criar objetos<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">abstract<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Creator<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ O Factory Method retorna um objeto da classe Product<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">abstract<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Product<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">factoryMethod<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\">\/\/ Classe concreta que implementa o Factory Method<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">ConcreteCreator<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">extends<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB; font-weight: bold\">Creator<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ Sobrescrevendo o Factory Method para retornar uma inst\u00e2ncia de ConcreteProduct<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Product<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">factoryMethod<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">return<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">new<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">ConcreteProduct<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\">\/\/ Classe abstrata que define a interface do objeto a ser criado<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">abstract<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Product<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">abstract<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">void<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">operation<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\">\/\/ Classe concreta que implementa a interface do objeto a ser criado<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">ConcreteProduct<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">extends<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB; font-weight: bold\">Product<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">void<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">operation<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">System<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">out<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">println<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Opera\u00e7\u00e3o do ConcreteProduct<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\">\/\/ Classe de teste que cria um objeto usando o Factory Method<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Main<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">static<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">void<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">main<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #8FBCBB\">String<\/span><span style=\"color: #ECEFF4\">[]<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">args<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">        <\/span><span style=\"color: #616E88\">\/\/ Cria uma inst\u00e2ncia de ConcreteCreator<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #8FBCBB\">Creator<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">creator<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">new<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">ConcreteCreator<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">        <\/span><span style=\"color: #616E88\">\/\/ Usa o Factory Method para criar um objeto de ConcreteProduct<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #8FBCBB\">Product<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">product<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">creator<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">factoryMethod<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">        <\/span><span style=\"color: #616E88\">\/\/ Chama a opera\u00e7\u00e3o do objeto criado<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">product<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">operation<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\">\/\/ Fonte: Chat GPT<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>O c\u00f3digo em Java \u00e9 muito semelhante ao c\u00f3digo em C#. A principal diferen\u00e7a \u00e9 a sintaxe, como a declara\u00e7\u00e3o de tipos de dados e o uso de chaves em blocos de c\u00f3digo. Fora isso, a l\u00f3gica \u00e9 a mesma.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Exemplo de implementa\u00e7\u00e3o em Python<\/h2>\n\n\n\n<p>Confira tamb\u00e9m o c\u00f3digo em Python equivalente ao c\u00f3digo em C# que implementa o padr\u00e3o Factory Method:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" style=\"font-size:.875rem;line-height:1.25rem\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0\">Python<\/span><span role=\"button\" tabindex=\"0\" data-code=\"# Classe abstrata que define a interface para criar objetos\nfrom abc import ABC, abstractmethod\n\nclass Creator(ABC):\n    # O Factory Method retorna um objeto da classe Product\n    @abstractmethod\n    def factory_method(self):\n        pass\n\n# Classe concreta que implementa o Factory Method\nclass ConcreteCreator(Creator):\n    # Sobrescrevendo o Factory Method para retornar uma inst\u00e2ncia de ConcreteProduct\n    def factory_method(self):\n        return ConcreteProduct()\n\n# Classe abstrata que define a interface do objeto a ser criado\nclass Product(ABC):\n    @abstractmethod\n    def operation(self):\n        pass\n\n# Classe concreta que implementa a interface do objeto a ser criado\nclass ConcreteProduct(Product):\n    def operation(self):\n        print(&quot;Opera\u00e7\u00e3o do ConcreteProduct&quot;)\n\n# Classe de teste que cria um objeto usando o Factory Method\ndef main():\n    # Cria uma inst\u00e2ncia de ConcreteCreator\n    creator = ConcreteCreator()\n\n    # Usa o Factory Method para criar um objeto de ConcreteProduct\n    product = creator.factory_method()\n\n    # Chama a opera\u00e7\u00e3o do objeto criado\n    product.operation()\n\nif __name__ == &quot;__main__&quot;:\n    main()\n\n# Fonte: Chat GPT\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\"><code><span class=\"line\"><span style=\"color: #616E88\"># Classe abstrata que define a interface para criar objetos<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">from<\/span><span style=\"color: #D8DEE9FF\"> abc <\/span><span style=\"color: #81A1C1\">import<\/span><span style=\"color: #D8DEE9FF\"> ABC<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> abstractmethod<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Creator<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">ABC<\/span><span style=\"color: #ECEFF4\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #616E88\"># O Factory Method retorna um objeto da classe Product<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">@<\/span><span style=\"color: #D08770\">abstractmethod<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">def<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">factory_method<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #81A1C1\">self<\/span><span style=\"color: #ECEFF4\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">pass<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># Classe concreta que implementa o Factory Method<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">ConcreteCreator<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #8FBCBB; font-weight: bold\">Creator<\/span><span style=\"color: #ECEFF4\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #616E88\"># Sobrescrevendo o Factory Method para retornar uma inst\u00e2ncia de ConcreteProduct<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">def<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">factory_method<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #81A1C1\">self<\/span><span style=\"color: #ECEFF4\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">return<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">ConcreteProduct<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># Classe abstrata que define a interface do objeto a ser criado<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Product<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">ABC<\/span><span style=\"color: #ECEFF4\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">@<\/span><span style=\"color: #D08770\">abstractmethod<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">def<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">operation<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #81A1C1\">self<\/span><span style=\"color: #ECEFF4\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">pass<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># Classe concreta que implementa a interface do objeto a ser criado<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">ConcreteProduct<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #8FBCBB; font-weight: bold\">Product<\/span><span style=\"color: #ECEFF4\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">def<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">operation<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #81A1C1\">self<\/span><span style=\"color: #ECEFF4\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #88C0D0\">print<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Opera\u00e7\u00e3o do ConcreteProduct<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># Classe de teste que cria um objeto usando o Factory Method<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">def<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">main<\/span><span style=\"color: #ECEFF4\">():<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #616E88\"># Cria uma inst\u00e2ncia de ConcreteCreator<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    creator <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">ConcreteCreator<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #616E88\"># Usa o Factory Method para criar um objeto de ConcreteProduct<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    product <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> creator<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">factory_method<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #616E88\"># Chama a opera\u00e7\u00e3o do objeto criado<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    product<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">operation<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> __name__ <\/span><span style=\"color: #81A1C1\">==<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">__main__<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #88C0D0\">main<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># Fonte: Chat GPT<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Em Python, a principal diferen\u00e7a em rela\u00e7\u00e3o ao C# e Java \u00e9 que n\u00e3o h\u00e1 necessidade de declarar explicitamente as interfaces. Em vez disso, usamos a biblioteca padr\u00e3o <code>abc<\/code> para definir classes abstratas. Al\u00e9m disso, a sintaxe de classes e m\u00e9todos \u00e9 diferente, e a declara\u00e7\u00e3o da classe <code>ConcreteProduct<\/code> n\u00e3o precisa especificar a heran\u00e7a de <code>object<\/code>, pois isso \u00e9 implicitamente herdado em Python 3.<\/p>\n\n\n\n<p>Fora isso, a l\u00f3gica \u00e9 a mesma. A classe abstrata <code>Creator<\/code> define a interface para criar objetos, enquanto a classe concreta <code>ConcreteCreator<\/code> implementa o Factory Method para criar objetos da classe <code>ConcreteProduct<\/code>. A classe abstrata <code>Product<\/code> define a interface do objeto a ser criado, enquanto a classe concreta <code>ConcreteProduct<\/code> implementa a interface do objeto a ser criado. Por fim, a fun\u00e7\u00e3o <code>main<\/code> usa o Factory Method para criar um objeto de <code>ConcreteProduct<\/code> e chama a opera\u00e7\u00e3o do objeto criado.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclus\u00e3o<\/h2>\n\n\n\n<p>Os <strong><a href=\"https:\/\/pt.wikipedia.org\/wiki\/%C3%81rvore_bin%C3%A1ria\" target=\"_blank\" rel=\"noreferrer noopener\">padr\u00f5es de projeto do GoF<\/a><\/strong> fornecem solu\u00e7\u00f5es comprovadas para problemas comuns no desenvolvimento de software. Divididos em tr\u00eas categorias &#8211; padr\u00f5es de cria\u00e7\u00e3o, padr\u00f5es de estrutura e padr\u00f5es de comportamento -, eles oferecem uma ampla variedade de solu\u00e7\u00f5es para diferentes problemas de software. <\/p>\n\n\n\n<p>\u00c9 importante lembrar que cada padr\u00e3o tem seus pr\u00f3prios pr\u00f3s e contras, e \u00e9 necess\u00e1rio entender quando e como aplic\u00e1-los corretamente. Espero que este artigo tenha ajudado a fornecer uma introdu\u00e7\u00e3o clara e did\u00e1tica aos padr\u00f5es de projeto do GoF, permitindo que programadores iniciantes comecem a explorar esse t\u00f3pico fascinante.<\/p>\n\n\n\n<p>Esse conte\u00fado \u00e9 parte do material disponibilizado para os participantes do meu grupo de estudos de <strong>Padr\u00f5es de Projeto<\/strong>. Voc\u00ea quer participar desse grupo? <strong><a href=\"https:\/\/elemarjr.com\/clube-de-estudos\/gof-design-patterns\/\">Clique aqui e veja como funciona<\/a><\/strong>.<\/p>\n","protected":false},"featured_media":4150,"parent":0,"template":"","cursos":[7],"class_list":["post-4149","artigos","type-artigos","status-publish","has-post-thumbnail","hentry","cursos-gof"],"acf":[],"_links":{"self":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/artigos\/4149","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/artigos"}],"about":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/types\/artigos"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/media\/4150"}],"wp:attachment":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/media?parent=4149"}],"wp:term":[{"taxonomy":"cursos","embeddable":true,"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/cursos?post=4149"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}