<?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>FZTech &#187; GoF</title>
	<atom:link href="http://fztech.dukitan.com/tag/gof/feed/" rel="self" type="application/rss+xml" />
	<link>http://fztech.dukitan.com</link>
	<description>rand() % {Programação, GameDev, TecnoInfo, Software Livre, Null}</description>
	<lastBuildDate>Thu, 05 Jan 2012 16:57:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>GoF AbstractFactory</title>
		<link>http://fztech.dukitan.com/2007/12/05/gof-abstractfactory/</link>
		<comments>http://fztech.dukitan.com/2007/12/05/gof-abstractfactory/#comments</comments>
		<pubDate>Thu, 06 Dec 2007 02:11:00 +0000</pubDate>
		<dc:creator>davidferreirafz</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[BoUML]]></category>
		<category><![CDATA[C e C++]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[GoF]]></category>

		<guid isPermaLink="false">http://david.dukitan.com/?p=44</guid>
		<description><![CDATA[Blz! Dando continuidade aos post do &#8220;GoF[1]&#8220;, estou agora publicando o exemplo utilizando o padrão &#8220;Abstract Factory[2]&#8220;. Observando o exemplo Abaixo (Veja exemplo anterior[3]) Podemos observar que o modelo proposto tem apenas quatro classes básicas (Verde Claro), e toda a criação do labirinto é feita pela classe &#8220;MazeGame&#8221;. O padrão Abstract Factory, permite a criação <a href='http://fztech.dukitan.com/2007/12/05/gof-abstractfactory/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<div style="text-align: justify">Blz!<br />
Dando continuidade aos post do &#8220;GoF[1]&#8220;, estou agora publicando o exemplo utilizando o padrão &#8220;Abstract Factory[2]&#8220;.</div>
<p>Observando o exemplo Abaixo (Veja exemplo anterior[3])</p>
<div style="text-align: justify"><a href="http://bp2.blogger.com/_JD_-EDbfZUo/R0dzz5veoDI/AAAAAAAAAfg/Mk2CBHn-m_o/s1600-h/GoF_DiagramaClasses.png"><img style="margin: 0px auto 10px;text-align: center;cursor: pointer" src="http://bp2.blogger.com/_JD_-EDbfZUo/R0dzz5veoDI/AAAAAAAAAfg/Mk2CBHn-m_o/s320/GoF_DiagramaClasses.png" border="0" alt="" /></a>Podemos observar que o modelo proposto tem apenas quatro classes básicas (Verde Claro), e toda a criação do labirinto é feita pela classe &#8220;MazeGame&#8221;.<br />
O padrão <span style="font-weight: bold">Abstract Factory</span>, permite a criação de uma família de objetos relacionados sem especificar suas classes concretas, ou seja:</div>
<div style="text-align: justify">Vai definir uma classe base de uma fábrica, que possui os métodos de criação de um conjunto de objetos, os quais são baseados em um ponto genérico(classe base), onde permite assim que tanto a fábrica quanto os objetos a serem construídos sejam de classe que estendam a família de classe raíz.</div>
<p><a href="http://bp0.blogger.com/_JD_-EDbfZUo/R1depK-_5NI/AAAAAAAAAgY/Rw6tqcGHXuc/s1600-h/GoF_DiagramaClasses.png"><img style="margin: 0px auto 10px;text-align: center;cursor: pointer" src="http://bp0.blogger.com/_JD_-EDbfZUo/R1depK-_5NI/AAAAAAAAAgY/Rw6tqcGHXuc/s320/GoF_DiagramaClasses.png" border="0" alt="" /></a></p>
<p>Observando o diagrama de classe acima, podemos notar que:</p>
<ul style="text-align: justify">
<li>Foi definida como fábrica base a classe &#8220;<span style="font-style: italic">MazeFactory</span>&#8220;, a qual define métodos para criação dos tipos básicos &#8220;<span style="font-style: italic">Room</span>&#8220;,&#8221;<span style="font-style: italic">Door</span>&#8220;,&#8221;<span style="font-style: italic">Wall</span>&#8220;;</li>
<li>Foi criada a classe &#8220;<span style="font-style: italic">BombedWall</span>&#8221; que estende a classe &#8220;<span style="font-style: italic">Wall</span>&#8220;;</li>
<li>Foi criada a classe &#8220;<span style="font-style: italic">EnchantedDoo</span>r&#8221; que estende a classe &#8220;<span style="font-style: italic">Door</span>&#8220;;</li>
<li>Foram criadas as classe &#8220;<span style="font-style: italic">RoomWithABomb</span>&#8221; e &#8220;<span style="font-style: italic">EnchantedRoom</span>&#8221; que estendem a classe &#8220;<span style="font-style: italic">Room</span>&#8220;;</li>
<li>Foram criadas duas fábricas que estendem a classe &#8220;<span style="font-style: italic">MazeFactory</span>&#8220;, sendo elas &#8220;<span style="font-style: italic">BombedMazeFactory</span>&#8221; e &#8220;<span style="font-style: italic">EnchantedMazeFactory</span>&#8220;;</li>
</ul>
<div style="text-align: justify">Como podemos observar a classe fábrica base é capaz de construir as peças básicas do labirinto, já a classe fábrica &#8220;<span style="font-style: italic">BombedMazeFactory</span>&#8221; é capaz de construir tudo que a classe &#8220;<span style="font-style: italic">MazeFactory</span>&#8221; faz, além de pela sobrecarga produzir objetos do tipo &#8220;<span style="font-style: italic">RoomWithABomb</span>&#8221; (subclasse de &#8220;<span style="font-style: italic">Room</span>&#8220;) e  &#8220;<span style="font-style: italic">BombedWall</span>&#8221; (subclasse de &#8220;<span style="font-style: italic">Wall</span>&#8220;).</div>
<div style="text-align: justify">Onde para que o usuário desta classe consiga construir labirintos de um dos três tipos &#8220;Básicos&#8221;, &#8220;ComBomba&#8221; ou &#8220;Encantado&#8221; basta ele passar para a classe &#8220;<span style="font-style: italic">MazeGame</span>&#8221; um objeto do tipo de fábrica desejado, como podemos ver no exemplo abaixo:</div>
<p><span style="font-family: courier new">//  MazeFactory factory;</span><br />
<span style="font-family: courier new">//  EnchantedMazeFactory factory;</span><br />
<span style="font-family: courier new"> BombedMazeFactory factory;</span></p>
<p><span style="font-family: courier new"> Maze * aMaze = mazeGame.create(factory);</span></p>
<p><span style="font-style: italic">&#8220;Mudando apenas a instância da factory produzimos o que desejamos.&#8221;</span><br />
Por final o resultado produzido é o apresentado na figura abaixo:</p>
<p><a href="http://bp3.blogger.com/_JD_-EDbfZUo/R1dep6-_5OI/AAAAAAAAAgg/oGZNiVqRN68/s1600-h/GoF_Execucao.png"><img style="margin: 0px auto 10px;text-align: center;cursor: pointer" src="http://bp3.blogger.com/_JD_-EDbfZUo/R1dep6-_5OI/AAAAAAAAAgg/oGZNiVqRN68/s320/GoF_Execucao.png" border="0" alt="" /></a><br />
A melhor forma de entender os padrões é conhecendo sua finalidade e motivação, além de ver sua implementação, então não se esqueça de baixar o código deste exemplo e consultar os links de referência no final deste post.</p>
<p>Download[4]: <a href="http://downloads.sourceforge.net/pjmoo/GoF_AbstractFactory.zip">http://downloads.sourceforge.net/pjmoo/GoF_AbstractFactory.zip</a></p>
<p>T+!<br />
Vida Longa e Próspera!</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>Referência<br />
[1]<a href="http://pt.wikipedia.org/wiki/Design_Patterns">http://pt.wikipedia.org/wiki/Design_Patterns</a><br />
[2]<a href="http://pt.wikipedia.org/wiki/Abstract_Factory">http://pt.wikipedia.org/wiki/Abstract_Factory</a><br />
[3]<a href="http://davidferreira-fz.blogspot.com/2007/11/gof-exemplos.html">http://davidferreira-fz.blogspot.com/2007/11/gof-exemplos.html</a><br />
[4]<a href="http://downloads.sourceforge.net/pjmoo/GoF_AbstractFactory.zip">http://downloads.sourceforge.net/pjmoo/GoF_AbstractFactory.zip</a><br />
[5]<a href="http://pjmoo.wiki.sourceforge.net/GoF">http://pjmoo.wiki.sourceforge.net/GoF</a></p>
]]></content:encoded>
			<wfw:commentRss>http://fztech.dukitan.com/2007/12/05/gof-abstractfactory/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

