<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ensaios Noturnos &#187; abstract factory</title>
	<atom:link href="http://www.ruppel.eng.br/tag/abstract-factory/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ruppel.eng.br</link>
	<description>Engenheiro, psicólogo, jornalista, médico, louco, palmeirense...</description>
	<lastBuildDate>Thu, 29 Jul 2010 03:07:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1-alpha</generator>
		<item>
		<title>Design Patterns &#8211; Patterns Criacionais: Abstract Factory</title>
		<link>http://www.ruppel.eng.br/2010/01/16/design-patterns-patterns-criacionais-abstract-factory/</link>
		<comments>http://www.ruppel.eng.br/2010/01/16/design-patterns-patterns-criacionais-abstract-factory/#comments</comments>
		<pubDate>Sun, 17 Jan 2010 02:40:10 +0000</pubDate>
		<dc:creator>Ruppel</dc:creator>
				<category><![CDATA[Engenheiro]]></category>
		<category><![CDATA[abstract factory]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[patterns criacionais]]></category>
		<category><![CDATA[resumo dos clássicos da computação]]></category>

		<guid isPermaLink="false">http://www.ruppel.eng.br/?p=65</guid>
		<description><![CDATA[Patterns Criacionais A Abstract Factory é a primeira Design Pattern descrita no livro Design Patterns. Ela faz parte da categoria de Patterns Criacionais, cujo objetivo é a instanciação de objetos. Essa categoria é importante pois ela sustenta o princípio mais importante do livro: &#8220;programe para interfaces e não para implementações&#8221;. Todas as patterns tratam a [...]]]></description>
			<content:encoded><![CDATA[<p><span style="font-weight: bold;">Patterns Criacionais</span></p>
<p>A Abstract Factory é a primeira Design Pattern descrita no livro Design Patterns. Ela faz parte da categoria de Patterns Criacionais, cujo objetivo é a instanciação de objetos. Essa categoria é importante pois ela sustenta o princípio mais importante do livro: &#8220;programe para interfaces e não para implementações&#8221;.</p>
<p>Todas as patterns tratam a respeito de relações entre os objetos, de forma que eles sejam independentes das implementações. Porém, em algum momento esses objetos deverão ser instanciados, e aí entram em cena as Patterns Criacionais, cujo único objetivo é a instanciação de objetos de forma que seu sistema continue independente de implementações.</p>
<p>Posso dizer que, atualmente, essas patterns criacionais estão em desuso, sendo substituídas pelos frameworks de Injeção de Dependência, que fazem exatamente isso: instanciam para você as classes das quais você é dependente. De toda forma, conhecer as patterns, a sua motivação e entender as suas consequências é um bom exercício de design de software.</p>
<p><span style="font-weight: bold;">Abstract Factory</span></p>
<p>O problema específico que a AbstractFactory tenta resolver é da instanciação na existência de uma família de produtos. O exemplo dado no livro é o seguinte: você tem elementos visuais (produtos), como Window, ScrollBar, Menu e etc. Esses elementos visuais têm diferentes implementações para cada família de implementação gráfica, como o Microsoft Windows, o MAC, e X do Linux.</p>
<p>Nesse caso, a solução consiste de duas coisas:</p>
<p>1. Crie interfaces padrões para os diferentes produtos dessa família (como Window, ScrollBar e Menu). E todo o seu sistema vai trabalhar apenas com essas interfaces que você definiu.</p>
<p>2. Defina uma AbstractFactory, que tem os métodos de instanciação para cada uma dessas interfaces padrões definidas acima, no caso, os métodos para o exemplo seriam: CreateWindow, CreateScrollBar, CreateMenu. Toda hora que o seu sistema precisa de instâncias dos produtos ele as obterá através dessa AbstractFactory. &nbsp;Algo como factory.CreateWindow()</p>
<p>Mas de onde virá essa factory? Em algum lugar, provavelmente na inicialização do seu sistema, você define qual AbstractFactory você vai fornecer ao seu sistema, e repassa essa factory a todos os objetos que precisarem dela.</p>
<p><a href="http://www.ruppel.eng.br/wp-content/uploads/2010/01/abstract_factory1.jpeg"><img class="aligncenter size-full wp-image-67" title="abstract_factory" src="http://www.ruppel.eng.br/wp-content/uploads/2010/01/abstract_factory1.jpeg" alt="" height="280" width="602"></a></p>
<p>Na figura acima, retirada do livro, o Client, que representa o “resto do seu sistema”, utiliza as classes abstratas dos produtos (AbstractProductA e AbstractProductB) e a AbstractFactory, assim como foi explicado.</p>
<p><span style="font-weight: bold;">Prós x Contras</span></p>
<p>É importante agora analisar os benefícios e malefícios dessa pattern. O ponto principal é que a pattern deixa seu sistema independente das diferentes famílias, ou seja, garante o baixo acoplamento que foi falado no começo.</p>
<p>Outro ponto positivo é que a pattern permite adicionar, remover ou modificar rapidamente qual família de produtos deseja-se usar. Isso pode até ser feito em runtime, se usado com um pouco de Reflection.</p>
<p>O ponto negativo desse pattern é que a adição ou remoção de um produto da família exige a modificação da AbstractFactory, o que causa um grande overhead, pois deve-se modificar todas as implementações da factory e o cliente que usa a AbstractFactory.</p>
<p>Na verdade, usando-se Reflection pode-se até criar um único método “Create” que recebe como parâmetro alguma indicação de qual produto ele deve criar (uma string com o nome da classe, por exemplo). Assim, você poderia criar um novo produto sem muitos problemas, basta passar o parâmetro certo para o novo produto. Mas isso funciona como uma balança: se você ganha flexibilidade na criação de novos produtos, você perde com a necessidade de uma interface única para todos esses produtos, já que eles serão retornados pelo mesmo método “Create”. &nbsp;E o seu client precisará fazer um cast para o produto certo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ruppel.eng.br/2010/01/16/design-patterns-patterns-criacionais-abstract-factory/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
