{"id":6089,"date":"2023-06-27T09:20:58","date_gmt":"2023-06-27T12:20:58","guid":{"rendered":"https:\/\/elemarjr.com\/clube-de-estudos\/?p=6089"},"modified":"2023-10-21T21:35:02","modified_gmt":"2023-10-22T00:35:02","slug":"introducao-ao-padrao-de-projeto-factory-method-no-ddd","status":"publish","type":"artigos","link":"https:\/\/elemarjr.com\/clube-de-estudos\/artigos\/introducao-ao-padrao-de-projeto-factory-method-no-ddd\/","title":{"rendered":"Introdu\u00e7\u00e3o ao padr\u00e3o de projeto Factory Method no DDD"},"content":{"rendered":"\n<p>Quando falamos em <em>Domain-Driven Design (DDD)<\/em>, alguns conceitos s\u00e3o imprescind\u00edveis para a correta compreens\u00e3o e aplica\u00e7\u00e3o desta abordagem. Um desses conceitos \u00e9 o de Agregados e, dentro deste contexto, o papel do padr\u00e3o de projeto <em>Factory Method<\/em> torna-se fundamental. \u00c9 atrav\u00e9s dele que conseguimos simplificar a cria\u00e7\u00e3o de agregados, otimizando o desenvolvimento e a manuten\u00e7\u00e3o de nossos sistemas. Mas antes de adentrarmos no <em>Factory Method<\/em>, vamos entender um pouco mais sobre o que s\u00e3o agregados no DDD.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Entendendo o conceito de agregados no DDD<\/h2>\n\n\n\n<p>Os agregados s\u00e3o componentes-chave em um modelo de dom\u00ednio. Imagine que voc\u00ea tenha v\u00e1rias classes que precisam trabalhar juntas para executar uma tarefa. Nesse caso, a classe que cont\u00e9m as outras e coordena as a\u00e7\u00f5es \u00e9 chamada de agregado.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">A import\u00e2ncia dos agregados no DDD<\/h3>\n\n\n\n<p>Agregados garantem a consist\u00eancia do modelo de dom\u00ednio, j\u00e1 que concentram e coordenam as opera\u00e7\u00f5es entre os objetos que fazem parte do dom\u00ednio. Uma mudan\u00e7a em um dos objetos do agregado n\u00e3o passa despercebida pelo agregado. Ele assegura que todas as regras de neg\u00f3cio sejam cumpridas antes de qualquer altera\u00e7\u00e3o ser confirmada.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">A constru\u00e7\u00e3o de agregados no DDD<\/h3>\n\n\n\n<p>A constru\u00e7\u00e3o de agregados pode ser um processo complexo. Podem haver depend\u00eancias a serem resolvidas, l\u00f3gica de neg\u00f3cios a ser implementada e valida\u00e7\u00f5es a serem feitas. \u00c9 a\u00ed que entra o <em>Factory Method<\/em>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">O papel do padr\u00e3o Factory Method na cria\u00e7\u00e3o de agregados<\/h2>\n\n\n\n<p>O padr\u00e3o <em>Factory Method <\/em>tem como principal fun\u00e7\u00e3o encapsular a l\u00f3gica de cria\u00e7\u00e3o de um objeto, ou neste caso, de um agregado.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Como o Factory Method facilita a cria\u00e7\u00e3o de agregados<\/h3>\n\n\n\n<p>Ao utilizar o <em>Factory Method<\/em>, voc\u00ea pode separar a l\u00f3gica de cria\u00e7\u00e3o dos agregados do resto do c\u00f3digo. Isso permite que voc\u00ea tenha classes especializadas para tratar da cria\u00e7\u00e3o dos agregados, garantindo uma maior coes\u00e3o e evitando a dispers\u00e3o do c\u00f3digo de cria\u00e7\u00e3o por todo o sistema.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Benef\u00edcios do Factory Method na constru\u00e7\u00e3o de agregados<\/h3>\n\n\n\n<p>Al\u00e9m da coes\u00e3o e da facilidade de manuten\u00e7\u00e3o, a utiliza\u00e7\u00e3o do <em>Factory Method <\/em>tamb\u00e9m facilita a aplica\u00e7\u00e3o de boas pr\u00e1ticas de programa\u00e7\u00e3o. Por exemplo, a inje\u00e7\u00e3o de depend\u00eancias e a aplica\u00e7\u00e3o de testes automatizados se tornam tarefas mais simples quando utilizamos este padr\u00e3o.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Aplicando o padr\u00e3o Factory Method em um exemplo pr\u00e1tico<\/h2>\n\n\n\n<p>Agora que entendemos a teoria, vamos coloc\u00e1-la em pr\u00e1tica. Imagine que temos um sistema de e-commerce e precisamos criar um agregado para tratar do processo de <em>checkout<\/em>. Neste caso, podemos utilizar o <em>Factory Method<\/em> para encapsular toda a l\u00f3gica de cria\u00e7\u00e3o deste agregado.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Exemplo de implementa\u00e7\u00e3o em C#<\/h3>\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=\"\/\/ Produto Abstrato\npublic abstract class ObjetoAgregado\n{\n    public abstract void RealizarAcao();\n}\n\n\/\/ Produtos Concretos\npublic class ObjetoAgregadoConcretoA : ObjetoAgregado\n{\n    public override void RealizarAcao()\n    {\n        Console.WriteLine(&quot;Realizando a\u00e7\u00e3o para Objeto Agregado A...&quot;);\n    }\n}\n\npublic class ObjetoAgregadoConcretoB : ObjetoAgregado\n{\n    public override void RealizarAcao()\n    {\n        Console.WriteLine(&quot;Realizando a\u00e7\u00e3o para Objeto Agregado B...&quot;);\n    }\n}\n\n\/\/ Criador (Factory)\npublic abstract class FabricaObjetoAgregado\n{\n    public abstract ObjetoAgregado CriarObjetoAgregado();\n}\n\n\/\/ Criadores Concretos\npublic class FabricaObjetoAgregadoA : FabricaObjetoAgregado\n{\n    public override ObjetoAgregado CriarObjetoAgregado()\n    {\n        return new ObjetoAgregadoConcretoA();\n    }\n}\n\npublic class FabricaObjetoAgregadoB : FabricaObjetoAgregado\n{\n    public override ObjetoAgregado CriarObjetoAgregado()\n    {\n        return new ObjetoAgregadoConcretoB();\n    }\n}\n\n\/\/ Cliente\npublic class Cliente\n{\n    private FabricaObjetoAgregado _fabrica;\n\n    public Cliente(FabricaObjetoAgregado fabrica)\n    {\n        _fabrica = fabrica;\n    }\n\n    public void RealizarAcaoObjetoAgregado()\n    {\n        ObjetoAgregado objetoAgregado = _fabrica.CriarObjetoAgregado();\n        objetoAgregado.RealizarAcao();\n    }\n}\n\n\/\/ Uso\npublic class Programa\n{\n    public static void Main()\n    {\n        FabricaObjetoAgregado fabricaA = new FabricaObjetoAgregadoA();\n        Cliente clienteA = new Cliente(fabricaA);\n        clienteA.RealizarAcaoObjetoAgregado();\n\n        FabricaObjetoAgregado fabricaB = new FabricaObjetoAgregadoB();\n        Cliente clienteB = new Cliente(fabricaB);\n        clienteB.RealizarAcaoObjetoAgregado();\n    }\n}\n\n\/\/ Fonte:ChatGPT\" 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\">\/\/ Produto Abstrato<\/span><\/span>\n<span class=\"line\"><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\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">ObjetoAgregado<\/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\">RealizarAcao<\/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\">\/\/ Produtos Concretos<\/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\">ObjetoAgregadoConcretoA<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> ObjetoAgregado<\/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\">RealizarAcao<\/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\">Realizando a\u00e7\u00e3o para Objeto Agregado A...<\/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: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">ObjetoAgregadoConcretoB<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> ObjetoAgregado<\/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\">RealizarAcao<\/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\">Realizando a\u00e7\u00e3o para Objeto Agregado B...<\/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\">\/\/ Criador (Factory)<\/span><\/span>\n<span class=\"line\"><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\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">FabricaObjetoAgregado<\/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\"> ObjetoAgregado <\/span><span style=\"color: #88C0D0\">CriarObjetoAgregado<\/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\">\/\/ Criadores Concretos<\/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\">FabricaObjetoAgregadoA<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> FabricaObjetoAgregado<\/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\"> ObjetoAgregado <\/span><span style=\"color: #88C0D0\">CriarObjetoAgregado<\/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\"> ObjetoAgregadoConcretoA<\/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: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">FabricaObjetoAgregadoB<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> FabricaObjetoAgregado<\/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\"> ObjetoAgregado <\/span><span style=\"color: #88C0D0\">CriarObjetoAgregado<\/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\"> ObjetoAgregadoConcretoB<\/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\">\/\/ Cliente<\/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\">Cliente<\/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\">private<\/span><span style=\"color: #D8DEE9FF\"> FabricaObjetoAgregado _fabrica<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">Cliente<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">FabricaObjetoAgregado fabrica<\/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\">_fabrica<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">fabrica<\/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>\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\">RealizarAcaoObjetoAgregado<\/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\">        ObjetoAgregado objetoAgregado <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">_fabrica<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">CriarObjetoAgregado<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">objetoAgregado<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">RealizarAcao<\/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\">\/\/ Uso<\/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\">Programa<\/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\">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>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        FabricaObjetoAgregado fabricaA <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">new<\/span><span style=\"color: #D8DEE9FF\"> FabricaObjetoAgregadoA<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        Cliente clienteA <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">new<\/span><span style=\"color: #D8DEE9FF\"> Cliente<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">fabricaA<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">clienteA<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">RealizarAcaoObjetoAgregado<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        FabricaObjetoAgregado fabricaB <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">new<\/span><span style=\"color: #D8DEE9FF\"> FabricaObjetoAgregadoB<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        Cliente clienteB <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">new<\/span><span style=\"color: #D8DEE9FF\"> Cliente<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">fabricaB<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">clienteB<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">RealizarAcaoObjetoAgregado<\/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:ChatGPT<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Neste exemplo, temos uma classe abstrata <code>ObjetoAgregado<\/code> representando o produto abstrato, e duas implementa\u00e7\u00f5es concretas, <code>ObjetoAgregadoConcretoA<\/code> e <code>ObjetoAgregadoConcretoB<\/code>. O criador abstrato, <code>FabricaObjetoAgregado<\/code>, declara o m\u00e9todo de f\u00e1brica <code>CriarObjetoAgregado()<\/code>, que cada criador concreto (<code>FabricaObjetoAgregadoA<\/code> e <code>FabricaObjetoAgregadoB<\/code>) sobrescreve para criar o respectivo produto concreto. O cliente (<code>Cliente<\/code>) recebe uma f\u00e1brica concreta como depend\u00eancia e a utiliza para criar e realizar a\u00e7\u00f5es nos objetos agregados.<\/p>\n\n\n\n<p>Por favor, observe que este \u00e9 um exemplo simplificado para demonstrar o conceito do padr\u00e3o Factory Method no contexto da cria\u00e7\u00e3o de agregados. Em um cen\u00e1rio real, haveria l\u00f3gica e intera\u00e7\u00f5es mais complexas envolvidas.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Exemplo de implementa\u00e7\u00e3o em Java<\/h3>\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=\"\/\/ Produto Abstrato\nabstract class ObjetoAgregado {\n    public abstract void realizarAcao();\n}\n\n\/\/ Produtos Concretos\nclass ObjetoAgregadoConcretoA extends ObjetoAgregado {\n    @Override\n    public void realizarAcao() {\n        System.out.println(&quot;Realizando a\u00e7\u00e3o para Objeto Agregado A...&quot;);\n    }\n}\n\nclass ObjetoAgregadoConcretoB extends ObjetoAgregado {\n    @Override\n    public void realizarAcao() {\n        System.out.println(&quot;Realizando a\u00e7\u00e3o para Objeto Agregado B...&quot;);\n    }\n}\n\n\/\/ Criador (Factory)\nabstract class FabricaObjetoAgregado {\n    public abstract ObjetoAgregado criarObjetoAgregado();\n}\n\n\/\/ Criadores Concretos\nclass FabricaObjetoAgregadoA extends FabricaObjetoAgregado {\n    @Override\n    public ObjetoAgregado criarObjetoAgregado() {\n        return new ObjetoAgregadoConcretoA();\n    }\n}\n\nclass FabricaObjetoAgregadoB extends FabricaObjetoAgregado {\n    @Override\n    public ObjetoAgregado criarObjetoAgregado() {\n        return new ObjetoAgregadoConcretoB();\n    }\n}\n\n\/\/ Cliente\nclass Cliente {\n    private FabricaObjetoAgregado fabrica;\n\n    public Cliente(FabricaObjetoAgregado fabrica) {\n        this.fabrica = fabrica;\n    }\n\n    public void realizarAcaoObjetoAgregado() {\n        ObjetoAgregado objetoAgregado = fabrica.criarObjetoAgregado();\n        objetoAgregado.realizarAcao();\n    }\n}\n\n\/\/ Uso\npublic class Programa {\n    public static void main(String[] args) {\n        FabricaObjetoAgregado fabricaA = new FabricaObjetoAgregadoA();\n        Cliente clienteA = new Cliente(fabricaA);\n        clienteA.realizarAcaoObjetoAgregado();\n\n        FabricaObjetoAgregado fabricaB = new FabricaObjetoAgregadoB();\n        Cliente clienteB = new Cliente(fabricaB);\n        clienteB.realizarAcaoObjetoAgregado();\n    }\n}\n\n\/\/Fonte: ChatGPT\" 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\">\/\/ Produto Abstrato<\/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\">ObjetoAgregado<\/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\">realizarAcao<\/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\">\/\/ Produtos Concretos<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">ObjetoAgregadoConcretoA<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">extends<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB; font-weight: bold\">ObjetoAgregado<\/span><span style=\"color: #D8DEE9FF\"> <\/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\">Override<\/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\">realizarAcao<\/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\">Realizando a\u00e7\u00e3o para Objeto Agregado A...<\/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: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">ObjetoAgregadoConcretoB<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">extends<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB; font-weight: bold\">ObjetoAgregado<\/span><span style=\"color: #D8DEE9FF\"> <\/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\">Override<\/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\">realizarAcao<\/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\">Realizando a\u00e7\u00e3o para Objeto Agregado B...<\/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\">\/\/ Criador (Factory)<\/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\">FabricaObjetoAgregado<\/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: #8FBCBB\">ObjetoAgregado<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">criarObjetoAgregado<\/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\">\/\/ Criadores Concretos<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">FabricaObjetoAgregadoA<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">extends<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB; font-weight: bold\">FabricaObjetoAgregado<\/span><span style=\"color: #D8DEE9FF\"> <\/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\">Override<\/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\">ObjetoAgregado<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">criarObjetoAgregado<\/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\">ObjetoAgregadoConcretoA<\/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: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">FabricaObjetoAgregadoB<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">extends<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB; font-weight: bold\">FabricaObjetoAgregado<\/span><span style=\"color: #D8DEE9FF\"> <\/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\">Override<\/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\">ObjetoAgregado<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">criarObjetoAgregado<\/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\">ObjetoAgregadoConcretoB<\/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\">\/\/ Cliente<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Cliente<\/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\">private<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">FabricaObjetoAgregado<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">fabrica<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">Cliente<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #8FBCBB\">FabricaObjetoAgregado<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">fabrica<\/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\">this<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">fabrica<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> fabrica<\/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>\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\">realizarAcaoObjetoAgregado<\/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: #8FBCBB\">ObjetoAgregado<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">objetoAgregado<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">fabrica<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">criarObjetoAgregado<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">objetoAgregado<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">realizarAcao<\/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\">\/\/ Uso<\/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\">Programa<\/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: #D8DEE9FF\">        <\/span><span style=\"color: #8FBCBB\">FabricaObjetoAgregado<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">fabricaA<\/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\">FabricaObjetoAgregadoA<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #8FBCBB\">Cliente<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">clienteA<\/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\">Cliente<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">fabricaA<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">clienteA<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">realizarAcaoObjetoAgregado<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #8FBCBB\">FabricaObjetoAgregado<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">fabricaB<\/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\">FabricaObjetoAgregadoB<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #8FBCBB\">Cliente<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">clienteB<\/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\">Cliente<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">fabricaB<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">clienteB<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">realizarAcaoObjetoAgregado<\/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: ChatGPT<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Neste exemplo, temos uma classe abstrata <code>ObjetoAgregado<\/code> representando o produto abstrato, e duas implementa\u00e7\u00f5es concretas, <code>ObjetoAgregadoConcretoA<\/code> e <code>ObjetoAgregadoConcretoB<\/code>. O criador abstrato, <code>FabricaObjetoAgregado<\/code>, declara o m\u00e9todo de f\u00e1brica <code>criarObjetoAgregado()<\/code>, que cada criador concreto (<code>FabricaObjetoAgregadoA<\/code> e <code>FabricaObjetoAgregadoB<\/code>) sobrescreve para criar o respectivo produto concreto. O cliente (<code>Cliente<\/code>) recebe uma f\u00e1brica concreta como depend\u00eancia e a utiliza para criar e realizar a\u00e7\u00f5es nos objetos agregados.<\/p>\n\n\n\n<p>Novamente, ressalto que este \u00e9 um exemplo simplificado para demonstrar o conceito do padr\u00e3o Factory Method no contexto da cria\u00e7\u00e3o de agregados. Em uma situa\u00e7\u00e3o real, poderiam existir l\u00f3gicas e intera\u00e7\u00f5es mais complexas envolvidas.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Exemplo de implementa\u00e7\u00e3o em Python<\/h3>\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=\"# Produto Abstrato\nclass ObjetoAgregado:\n    def realizar_acao(self):\n        pass\n\n# Produtos Concretos\nclass ObjetoAgregadoConcretoA(ObjetoAgregado):\n    def realizar_acao(self):\n        print(&quot;Realizando a\u00e7\u00e3o para Objeto Agregado A...&quot;)\n\nclass ObjetoAgregadoConcretoB(ObjetoAgregado):\n    def realizar_acao(self):\n        print(&quot;Realizando a\u00e7\u00e3o para Objeto Agregado B...&quot;)\n\n# Criador (Factory)\nclass FabricaObjetoAgregado:\n    def criar_objeto_agregado(self):\n        pass\n\n# Criadores Concretos\nclass FabricaObjetoAgregadoA(FabricaObjetoAgregado):\n    def criar_objeto_agregado(self):\n        return ObjetoAgregadoConcretoA()\n\nclass FabricaObjetoAgregadoB(FabricaObjetoAgregado):\n    def criar_objeto_agregado(self):\n        return ObjetoAgregadoConcretoB()\n\n# Cliente\nclass Cliente:\n    def __init__(self, fabrica):\n        self.fabrica = fabrica\n\n    def realizar_acao_objeto_agregado(self):\n        objeto_agregado = self.fabrica.criar_objeto_agregado()\n        objeto_agregado.realizar_acao()\n\n# Uso\nif __name__ == &quot;__main__&quot;:\n    fabrica_a = FabricaObjetoAgregadoA()\n    cliente_a = Cliente(fabrica_a)\n    cliente_a.realizar_acao_objeto_agregado()\n\n    fabrica_b = FabricaObjetoAgregadoB()\n    cliente_b = Cliente(fabrica_b)\n    cliente_b.realizar_acao_objeto_agregado()\n\n# Fonte: ChatGPT\" 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\"># Produto Abstrato<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">ObjetoAgregado<\/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\">realizar_acao<\/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\"># Produtos Concretos<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">ObjetoAgregadoConcretoA<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #8FBCBB; font-weight: bold\">ObjetoAgregado<\/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\">realizar_acao<\/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\">Realizando a\u00e7\u00e3o para Objeto Agregado A...<\/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: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">ObjetoAgregadoConcretoB<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #8FBCBB; font-weight: bold\">ObjetoAgregado<\/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\">realizar_acao<\/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\">Realizando a\u00e7\u00e3o para Objeto Agregado B...<\/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\"># Criador (Factory)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">FabricaObjetoAgregado<\/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\">criar_objeto_agregado<\/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\"># Criadores Concretos<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">FabricaObjetoAgregadoA<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #8FBCBB; font-weight: bold\">FabricaObjetoAgregado<\/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\">criar_objeto_agregado<\/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\">ObjetoAgregadoConcretoA<\/span><span style=\"color: #ECEFF4\">()<\/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\">FabricaObjetoAgregadoB<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #8FBCBB; font-weight: bold\">FabricaObjetoAgregado<\/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\">criar_objeto_agregado<\/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\">ObjetoAgregadoConcretoB<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># Cliente<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Cliente<\/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\">__init__<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #81A1C1\">self<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">fabrica<\/span><span style=\"color: #ECEFF4\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">self<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">fabrica <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> fabrica<\/span><\/span>\n<span class=\"line\"><\/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\">realizar_acao_objeto_agregado<\/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\">        objeto_agregado <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">self<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">fabrica<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">criar_objeto_agregado<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        objeto_agregado<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">realizar_acao<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># Uso<\/span><\/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\">    fabrica_a <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">FabricaObjetoAgregadoA<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    cliente_a <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">Cliente<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">fabrica_a<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    cliente_a<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">realizar_acao_objeto_agregado<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    fabrica_b <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">FabricaObjetoAgregadoB<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    cliente_b <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">Cliente<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">fabrica_b<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    cliente_b<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">realizar_acao_objeto_agregado<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># Fonte: ChatGPT<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Neste exemplo, temos uma classe abstrata <code>ObjetoAgregado<\/code> representando o produto abstrato, e duas implementa\u00e7\u00f5es concretas, <code>ObjetoAgregadoConcretoA<\/code> e <code>ObjetoAgregadoConcretoB<\/code>. A classe <code>FabricaObjetoAgregado<\/code> \u00e9 a classe criadora abstrata que declara o m\u00e9todo de f\u00e1brica <code>criar_objeto_agregado()<\/code>, que cada criador concreto (<code>FabricaObjetoAgregadoA<\/code> e <code>FabricaObjetoAgregadoB<\/code>) implementa para criar o respectivo produto concreto. O cliente (<code>Cliente<\/code>) recebe uma f\u00e1brica concreta como depend\u00eancia e a utiliza para criar e realizar a\u00e7\u00f5es nos objetos agregados.<\/p>\n\n\n\n<p>Este \u00e9 apenas um exemplo b\u00e1sico para ilustrar o conceito do padr\u00e3o Factory Method no contexto da cria\u00e7\u00e3o de agregados usando Python. Em situa\u00e7\u00f5es reais, podem existir mais complexidades e intera\u00e7\u00f5es envolvidas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Testando a aplica\u00e7\u00e3o do padr\u00e3o Factory Method<\/h2>\n\n\n\n<p>Testar a aplica\u00e7\u00e3o do padr\u00e3o <em>Factory Method<\/em> \u00e9 t\u00e3o importante quanto implement\u00e1-lo. Quando falamos de testes, estamos garantindo que nosso c\u00f3digo funciona como esperado e que futuras modifica\u00e7\u00f5es n\u00e3o quebrar\u00e3o funcionalidades j\u00e1 existentes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclus\u00e3o<\/h2>\n\n\n\n<p>Concluindo, a utiliza\u00e7\u00e3o do padr\u00e3o de projeto <em>Factory Method <\/em>no contexto do DDD \u00e9 uma excelente forma de garantir uma maior organiza\u00e7\u00e3o e coes\u00e3o do c\u00f3digo, facilitando a manuten\u00e7\u00e3o e evolu\u00e7\u00e3o do sistema como um todo.<\/p>\n\n\n\n<p>Esse conte\u00fado \u00e9 parte do material disponibilizado para os participantes do meu grupo de estudos de\u00a0<strong>DDD do Jeito Certo<\/strong>. Voc\u00ea quer participar desse grupo?\u00a0<a href=\"https:\/\/elemarjr.com\/clube-de-estudos\/ddd-do-jeito-certo\/\"><strong>Clique aqui e veja como funciona<\/strong><\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">D\u00favidas Frequentes<\/h2>\n\n\n\n<p><strong>O que \u00e9 um agregado no DDD?<\/strong><br>Agregados s\u00e3o componentes-chave em um modelo de dom\u00ednio, que concentram e coordenam as opera\u00e7\u00f5es entre os objetos que fazem parte do dom\u00ednio.<\/p>\n\n\n\n<p><strong>O que \u00e9 o padr\u00e3o <em>Factory Method<\/em>?<\/strong><br>O <em>Factory Method <\/em>\u00e9 um padr\u00e3o de projeto que encapsula a l\u00f3gica de cria\u00e7\u00e3o de um objeto, ou neste caso, de um agregado.<\/p>\n\n\n\n<p><strong>Como o <em>Factory Method <\/em>facilita a cria\u00e7\u00e3o de agregados?<\/strong><br>O <em>Factory Method <\/em>permite separar a l\u00f3gica de cria\u00e7\u00e3o dos agregados do resto do c\u00f3digo, possibilitando a cria\u00e7\u00e3o de classes especializadas para este fim.<\/p>\n\n\n\n<p><strong>Quais s\u00e3o os benef\u00edcios da aplica\u00e7\u00e3o do padr\u00e3o <em>Factory Method <\/em>na constru\u00e7\u00e3o de agregados?<\/strong><br>Al\u00e9m da maior coes\u00e3o e facilidade de manuten\u00e7\u00e3o, a utiliza\u00e7\u00e3o do <em>Factory Method <\/em>tamb\u00e9m facilita a aplica\u00e7\u00e3o de boas pr\u00e1ticas de programa\u00e7\u00e3o, como a inje\u00e7\u00e3o de depend\u00eancias e a aplica\u00e7\u00e3o de testes automatizados.<\/p>\n\n\n\n<p><strong>O que \u00e9 inje\u00e7\u00e3o de depend\u00eancias?<\/strong><br>Inje\u00e7\u00e3o de depend\u00eancias \u00e9 uma t\u00e9cnica que permite aumentar a flexibilidade e a testabilidade do c\u00f3digo, fornecendo as depend\u00eancias necess\u00e1rias para uma classe ao inv\u00e9s de permitir que a classe crie suas pr\u00f3prias depend\u00eancias.<\/p>\n","protected":false},"featured_media":6090,"parent":0,"template":"","cursos":[12],"class_list":["post-6089","artigos","type-artigos","status-publish","has-post-thumbnail","hentry","cursos-ddd-do-jeito-certo"],"acf":[],"_links":{"self":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/artigos\/6089","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\/6090"}],"wp:attachment":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/media?parent=6089"}],"wp:term":[{"taxonomy":"cursos","embeddable":true,"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/cursos?post=6089"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}