{"id":2335,"date":"2019-11-05T22:16:25","date_gmt":"2019-11-05T19:16:25","guid":{"rendered":"http:\/\/demensdeum.com\/blog\/?p=2335"},"modified":"2024-12-16T22:32:32","modified_gmt":"2024-12-16T19:32:32","slug":"factory-method-pattern","status":"publish","type":"post","link":"https:\/\/demensdeum.com\/blog\/pt\/2019\/11\/05\/factory-method-pattern\/","title":{"rendered":"M\u00e9todo de f\u00e1brica"},"content":{"rendered":"<p><a href=\"https:\/\/pxhere.com\/en\/photo\/1070638\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2346\" src=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2019\/11\/crates.jpg\" alt=\"\" width=\"520\" height=\"375\" srcset=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2019\/11\/crates.jpg 520w, https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2019\/11\/crates-300x216.jpg 300w\" sizes=\"auto, (max-width: 520px) 100vw, 520px\" \/><\/a><\/p>\n<p>O padr\u00e3o <b>Factory Method<\/b> refere-se a padr\u00f5es de design generativos.<br \/>Este padr\u00e3o descreve a cria\u00e7\u00e3o de uma interface para criar um objeto de uma classe espec\u00edfica. Parece simples, certo?<\/p>\n<h3>Em teoria<\/h3>\n<p>Suponha que estejamos desenvolvendo um framework para trabalhar com \u00f3culos AR, ao inclinar a cabe\u00e7a para o lado, um menu de aplicativos dispon\u00edveis dever\u00e1 aparecer diante dos olhos do usu\u00e1rio. As aplica\u00e7\u00f5es ser\u00e3o desenvolvidas por empresas terceirizadas, clientes do nosso framework. Naturalmente, n\u00e3o sabemos quais aplicativos, \u00edcones, nomes devem aparecer, por isso devemos fornecer uma interface para implementar o \u00edcone e informa\u00e7\u00f5es relacionadas sobre o aplicativo. Vamos cham\u00e1-lo de <b>Produto:<\/b><\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>protocol Product {\n var name: String { get }\n var image: Image { get }\n var executablePath: String { get }\n}\n<\/code><\/pre>\n<\/div>\n<p>Em seguida, precisamos fornecer uma interface para que nossos clientes possam implementar a emiss\u00e3o de uma s\u00e9rie de aplica\u00e7\u00f5es para seu <b>Produto Espec\u00edfico<\/b> &#8211; uma s\u00e9rie de \u00edcones de aplicativos com nomes, que j\u00e1 desenharemos no framework.<\/p>\n<p>Vamos escrever esta interface &#8211; Interface <b>Creator<\/b> contendo um <b>M\u00e9todo de f\u00e1brica<\/b> que retorna uma matriz de <b>Produtos<\/b>.<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>protocol Creator {\n func factoryMethod() -> [Product]\n}\n<\/code><\/pre>\n<\/div>\n<h3>Na pr\u00e1tica<\/h3>\n<p>O primeiro cliente do nosso framework AR foi a empresa 7B &#8211; fornecedor l\u00edder de software para cafeteiras em <em>Honduras<\/em>. Eles querem vender \u00f3culos de realidade aumentada com a capacidade de preparar caf\u00e9, verificar se a \u00e1gua\/gr\u00e3os est\u00e3o cheios e mostrar o caminho at\u00e9 a cafeteira mais pr\u00f3xima usando o modo de mapa interno.<\/p>\n<p>Eles realizam o desenvolvimento do software; apenas somos obrigados a fornecer documenta\u00e7\u00e3o sobre as interfaces do <b>Criador<\/b> e do <b>Produto<\/b> para a correta exibi\u00e7\u00e3o da lista de aplicativos e seus posteriores. lan\u00e7amento.<\/p>\n<p>Ap\u00f3s a transfer\u00eancia da documenta\u00e7\u00e3o, a empresa 7B, atrav\u00e9s da interface <b>Criador <\/b>, implementa o <b>Criador Espec\u00edfico <\/b>&#8211; classe que retorna uma matriz de \u00edcones de aplicativos. Os pr\u00f3prios aplicativos de \u00edcone s\u00e3o classes de <b>Produto Espec\u00edfico<\/b> que implementam a interface do <b>Produto<\/b>.<\/p>\n<p>C\u00f3digo de exemplo para <b>produtos espec\u00edficos<\/b>:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>class CoffeeMachineLocator: implements Product {\n let name = \u201c7B Coffee Machine Locator v.3000\u201d\n let image = Image.atPath(\u201cimages\/locator.tga\u201d)\n let executablePath = \u201cCoffeeMachineLocator.wasm\u201d\n}\n\nclass iPuchinno: implements Product {\n let name = \u201ciPuchinno 1.0.3\u201d\n let image = Image.atPath(\u201cimages\/puchino.pvrtc\u201d)\n let executablePath = \u201cneutron\/ipuchBugFixFinalNoFreezeFixAlpha4.js\u201d\n}\n<\/code><\/pre>\n<\/div>\n<p>Classe <b>Concrete Creator<\/b>, fornecendo um conjunto de duas aplica\u00e7\u00f5es:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>class 7BAppsCreator: implements Creator {\n func factoryMethod() -> [Product] {\n  return [CoffeeMachineLocator(), iPuchinno()]\n }\n}\n<\/code><\/pre>\n<\/div>\n<p>Depois disso, a empresa 7B compila a biblioteca de <b>Produtos Concretos<\/b>, <b>Concrete Creator<\/b> e a combina com nossa estrutura, come\u00e7a a vender \u00f3culos AR para suas cafeteiras, <em >adi\u00e7\u00f5es de nossa parte n\u00e3o s\u00e3o necess\u00e1rias<\/em>.<\/p>\n<h3>Fontes<\/h3>\n<p><a href=\"https:\/\/refactoring.guru\/ru\/design-patterns\/command\" target=\"_blank\" rel=\"noopener\">https:\/\/refactoring.guru\/ru\/design-patterns\/command <\/a><br \/><a href=\"https:\/\/www.amazon.com\/Design-Patterns-Elements-Reusable-Object-Oriented\/dp\/0201633612\" target=\"_blank\" rel=\"noopener\">https:\/\/www.amazon.com\/Design-Patterns-Elements-Reusable-Object-Oriented\/dp\/0201633612<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>O padr\u00e3o Factory Method refere-se a padr\u00f5es de design generativos.Este padr\u00e3o descreve a cria\u00e7\u00e3o de uma interface para criar um objeto de uma classe espec\u00edfica. Parece simples, certo? Em teoria Suponha que estejamos desenvolvendo um framework para trabalhar com \u00f3culos AR, ao inclinar a cabe\u00e7a para o lado, um menu de aplicativos dispon\u00edveis dever\u00e1 aparecer<a class=\"more-link\" href=\"https:\/\/demensdeum.com\/blog\/pt\/2019\/11\/05\/factory-method-pattern\/\">Continue reading <span class=\"screen-reader-text\">&#8220;M\u00e9todo de f\u00e1brica&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[61,52],"tags":[128,95],"class_list":["post-2335","post","type-post","status-publish","format-standard","hentry","category-techie","category-tutorials","tag-factory-method","tag-patterns","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"pt","enabled_languages":["en","ru","zh","de","fr","ja","pt"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"ru":{"title":true,"content":true,"excerpt":false},"zh":{"title":true,"content":true,"excerpt":false},"de":{"title":true,"content":true,"excerpt":false},"fr":{"title":true,"content":true,"excerpt":false},"ja":{"title":true,"content":true,"excerpt":false},"pt":{"title":true,"content":true,"excerpt":false}}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2335","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=2335"}],"version-history":[{"count":15,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2335\/revisions"}],"predecessor-version":[{"id":3934,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2335\/revisions\/3934"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=2335"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=2335"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=2335"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}