<?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>Portal do arquiteto de Software</title>
	<atom:link href="http://www.portalarquiteto.com.br/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.portalarquiteto.com.br</link>
	<description>Portal de arquitetura de software e desenvolvimento Java</description>
	<lastBuildDate>Tue, 22 Jun 2010 11:00:23 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>GoogleCL &#8211; Nova Ferramenta de linha de texto do google</title>
		<link>http://www.portalarquiteto.com.br/?p=557</link>
		<comments>http://www.portalarquiteto.com.br/?p=557#comments</comments>
		<pubDate>Tue, 22 Jun 2010 11:00:23 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[NOTÍCIAS]]></category>
		<category><![CDATA[FERRAMENTAS]]></category>

		<guid isPermaLink="false">http://www.portalarquiteto.com.br/?p=557</guid>
		<description><![CDATA[Acaba de ser lançada a mais nova ferramenta do google chamada GoogleCL. Esta ferramenta permite acesso aos serviços do google via linha de comando. 

Segundo o próprio site da ferramenta, os seguintes serviços já são suportados:
    * Blogger
          $ google blogger post &#8211;title [...]]]></description>
			<content:encoded><![CDATA[<div id=HOTWordsTxt name=HOTWordsTxt><p>Acaba de ser lançada a mais nova ferramenta do google chamada GoogleCL. Esta ferramenta permite acesso aos serviços do google via linha de comando. </p>
<p><img src="http://www.portalarquiteto.com.br/wp-content/uploads/2010/06/GoogleCL-300x93.jpg" alt="GoogleCL" title="GoogleCL" width="400" height="120" class="aligncenter size-medium wp-image-564" /></p>
<p>Segundo o próprio site da ferramenta, os seguintes serviços já são suportados:<br />
    * Blogger<br />
          $ google blogger post &#8211;title &#8220;foo&#8221; &#8220;command line posting&#8221; </p>
<p>    * Calendar<br />
          $ google calendar add &#8220;Lunch with Jim at noon tomorrow&#8221; </p>
<p>    * Contacts<br />
          $ google contacts list name,email > contacts.csv </p>
<p>    * Docs<br />
          $ google docs edit &#8211;title &#8220;Shopping list&#8221; </p>
<p>    * Picasa<br />
          $ google picasa create &#8211;title &#8220;Cat Photos&#8221; ~/photos/cats/*.jpg </p>
<p>    * Youtube<br />
          $ google youtube post &#8211;category Education killer_robots.avi </p>
<p>Este é um grande avanço e facilita o acesso a quem, como eu utiliza bastante linha de comandos. Mais informações podem ser encontradas no próprio site da ferramenta, em <a href="http://code.google.com/p/googlecl">http://code.google.com/p/googlecl</a>.</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.portalarquiteto.com.br/?feed=rss2&amp;p=557</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Trabalhando com JPA e enumerações</title>
		<link>http://www.portalarquiteto.com.br/?p=544</link>
		<comments>http://www.portalarquiteto.com.br/?p=544#comments</comments>
		<pubDate>Mon, 21 Jun 2010 11:00:15 +0000</pubDate>
		<dc:creator>Samuel Delfim</dc:creator>
				<category><![CDATA[DESENVOLVIMENTO JAVA]]></category>
		<category><![CDATA[DESENVOLVIMENTO]]></category>
		<category><![CDATA[JAVA]]></category>
		<category><![CDATA[JPA]]></category>

		<guid isPermaLink="false">http://www.portalarquiteto.com.br/?p=544</guid>
		<description><![CDATA[Olá pessoal,
A bastante tempo não escrevo nada, mas hoje surgiu um assunto que acho ser uma pedra no sapato de vários desenvolvedores e arquitetos. 
Enumerações, como o nome indica, são listas de valores associados a um conceito. Em java enumerações são subclasse da classe java.lang.Enum. Trabalhar com enumeração facilita bastante o trabalho do desenvolvedor, uma [...]]]></description>
			<content:encoded><![CDATA[<div id=HOTWordsTxt name=HOTWordsTxt><p>Olá pessoal,</p>
<p>A bastante tempo não escrevo nada, mas hoje surgiu um assunto que acho ser uma pedra no sapato de vários desenvolvedores e arquitetos. </p>
<p>Enumerações, como o nome indica, são listas de valores associados a um conceito. Em java enumerações são subclasse da classe java.lang.Enum. Trabalhar com enumeração facilita bastante o trabalho do desenvolvedor, uma vez que fornece uma maneira de trabalhar com uma lista de valores finitas e trabalhar com tipos fortes em java.</p>
<p>Vejamos um exemplo simples de como isto pode ser um problema em sistemas.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">enum</span> Sexo <span style="color: #009900;">&#123;</span>
    MASCULINO, FEMININO<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Ao realizar o mapeamento desta enumeração com JPA 1.0 utilizamos normalmente a anotação @Enumerated. Com esta anotação sem nenhum parâmetro ou passando o parâmetro EnumType.ORDINAL, o valor a ser persistido no banco seria:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">MASCULINO.<span style="color: #006633;">ordinal</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>   <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span> 
FEMININO.<span style="color: #006633;">ordinal</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">1</span></pre></td></tr></table></div>

<p>Uma das desvantagens desta abordagem é o problema do valor persistido não ser significante para o negócio, o que gera a necessidade de dicionário de dados. Outra desvantagem é o fato de não poder adicionar novos valores no começo e no meio da enumeração uma vez que já existem dados gravados com estes valores no banco.</p>
<p>Outra abordagem seria utilizar a anotação @Enumerated passando como parâmetro o EnumType.STRING. Com esta abordagem o valor a ser persistido passa a ser o método name da enumeração que é mostrado abaixo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">MASCULINO.<span style="color: #006633;">name</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;MASCULINO&quot;</span>
FEMININO.<span style="color: #006633;">name</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;FEMININO&quot;</span></pre></td></tr></table></div>

<p>Esta abordagem também possui alguns problemas. O maior deles é a briga que vc terá com qualquer DBA a respeito do que deveria ser gravado no campo. O que qualquer DBA falará é que deveria ser gravado no banco os valores &#8216;M&#8217; ou &#8216;F&#8217; para ter menos gasto de memória e melhor indexação do campo.</p>
<p>Uma abordagem que acho a melhor seria gravar no banco o valor &#8216;M&#8217; ou &#8216;F&#8217;, mas continuar trabalhando com a enumeração com os nomes MASCULINO e FEMININO. </p>
<p>Uma maneira de realizarmos esta modificação no código para funcionar desta maneira é mostrada abaixo:</p>
<p>Enumeração:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">enum</span> SexoEnum <span style="color: #009900;">&#123;</span>
	MASCULINO<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;M&quot;</span><span style="color: #009900;">&#41;</span>, FEMININO<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;F&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">String</span> value<span style="color: #339933;">;</span>
&nbsp;
	SexoEnum<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> value<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">value</span> <span style="color: #339933;">=</span> value<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> SexoEnum fromValue<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> value<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>value <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span>SexoEnum sexo <span style="color: #339933;">:</span> values<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>sexo.<span style="color: #006633;">value</span>.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span>value<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
					<span style="color: #000000; font-weight: bold;">return</span> sexo<span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">IllegalArgumentException</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Sexo invalido: &quot;</span> <span style="color: #339933;">+</span> value<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> toValue<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> value<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Na classe a ser mapeada o código ficaria próximo ao exemplo abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">@<span style="color: #003399;">Entity</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Pessoa <span style="color: #009900;">&#123;</span>
&nbsp;
	@Column<span style="color: #009900;">&#40;</span>length <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> sexo<span style="color: #339933;">;</span>
&nbsp;
	@<span style="color: #000000; font-weight: bold;">Transient</span>
	<span style="color: #000000; font-weight: bold;">public</span> SexoEnum getSexoEnum<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> SexoEnum.<span style="color: #006633;">fromValue</span><span style="color: #009900;">&#40;</span>sexo<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setSexoEnum<span style="color: #009900;">&#40;</span>SexoEnum sexoEnum<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">sexo</span> <span style="color: #339933;">=</span> sexo.<span style="color: #006633;">toValue</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Mapeando desta maneira trabalhamos então com o melhor dos dois mundos. Outra maneira bastante interessante de realizar o mapeamento seria a utilização do UserType do Hibernate, mas falamos disto em outro post.</p>
<p>Mais informações podem ser encontradas em <a href="http://www.vineetmanohar.com/2010/01/3-ways-to-serialize-java-enums">http://www.vineetmanohar.com/2010/01/3-ways-to-serialize-java-enums</a>.</p>
<p>É isto aí pessoal. Qualquer problema avisem&#8230;</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.portalarquiteto.com.br/?feed=rss2&amp;p=544</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Evento JBossInBossa2010</title>
		<link>http://www.portalarquiteto.com.br/?p=531</link>
		<comments>http://www.portalarquiteto.com.br/?p=531#comments</comments>
		<pubDate>Thu, 22 Apr 2010 09:00:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[EVENTOS]]></category>
		<category><![CDATA[DESENVOLVIMENTO]]></category>
		<category><![CDATA[JAVA]]></category>
		<category><![CDATA[JSF]]></category>

		<guid isPermaLink="false">http://www.portalarquiteto.com.br/?p=531</guid>
		<description><![CDATA[Pessoal,
Venho convidá-los para um evento da Comunidade JBoss Brasil. O evento irá acontecer em SP e conta com a participação de vários líderes de projetos Open Source. Segue mais detalhes do evento:
Horário: 7 maio 2010 às 14:00 a 8 maio 2010 às 20:00
Local: Anhembi Morumbi &#8211; Casa do Ator, Campos Vila Olimpia
Organizado por: Land do [...]]]></description>
			<content:encoded><![CDATA[<div id=HOTWordsTxt name=HOTWordsTxt><p>Pessoal,</p>
<p>Venho convidá-los para um evento da Comunidade JBoss Brasil. O evento irá acontecer em SP e conta com a participação de vários líderes de projetos Open Source. Segue mais detalhes do evento:</p>
<div class="wp-caption alignnone" style="width: 183px"><img title="Evento" src="http://api.ning.com/files/NNzLV55Kl2*GmrQKZxfT0dXdpcTfSiYIABRJdKhZZkR-FH56zVEKmxCd05iR0Xa3Iur-M9SiUOakoWdW9m9tlv9oefydaady/245143904.png?size=173&amp;crop=1%3A1" alt="Evento" width="173" height="173" /><br />
<p class="wp-caption-text">Evento</p></div>
<p><strong>Horário:</strong> 7 maio 2010 às 14:00 a 8 maio 2010 às 20:00<br />
<strong>Local:</strong> Anhembi Morumbi &#8211; Casa do Ator, Campos Vila Olimpia<br />
<strong>Organizado por:</strong> Land do Brasil</p>
<div><strong>Descrição do evento:</strong><br />
internacionais que são líderes de projetos opensource, bem como palestras da comunidade brasileira que desenvolve e fomenta tecnologias relaciodas além do time brasileiro JBoss que atua em diversos projetos de missão crítica que usam tecnologias de ponta em projetos em todos os lugares do Brasil.<br />
Presenças Internacionais da Red Hat/JBoss, eXo Platform e PlugTree/Drools</p>
<p>Pete Muir é o primeiro palestrante internacional a confirmar presença no JBoss In Bossa 2010, você não vai perder a oportunidade de saber tudo da JSR299 &#8211; CDI e sobre as novidades do JBoss Seam.</p>
<p>Pete Muir é o Líder do projeto Seam e do Weld(Implementação de referência da JSR 299 &#8211; Contexts and Dependency Injection for Java EE), além de desenvolvedor líder do Aquillian, um conjunto de utilitários para testes de Servidores de Aplicação. Pete é um funcionário da Red Hat Inc, como Core Developer trabalhando em vários projetos de código aberto JBoss.<br />
Pete tem palestrado em várias conferências como Devoxx, Jax, JBossWorld, JSFDays e JavaBlend, além de várias palestras em JUGs sobre Seam. Ele escreve sobre Seam, Weld e Java em seu blog: <a href="http://in.relation.to/Bloggers/Pete" target="_blank">http://in.relation.to/Bloggers/Pete</a></p>
<p>Benjamin Mestrallet é o CEO da eXo Platform, uma empresa francesa que ele fundou logo após a universidade para atender seu primeiro cliente: Departamento de Defesa Americano. Com a recente expansão da Exo para os EUA, Benjamin supervisiona de São Francisco-EUA o crescimento da companhia , marketing e estratégia de vendas. Ele criou o projeto eXo enquanto ainda estudante em Dezembro de 2002, entregando o primeito Java Portlet Container da indústria. Em reconhecimento a sua liderança, Benjamin recebeu o prêmio de &#8220;Estraordinário Jovem Líder de Tecnologia de 2008&#8243;, o IVY Award na França. Ele possui Mestrado em Ciência de Grenciamento pela Universidade de Paris IX Dauphine. Site da eXo Platform: <a href="http://www.exoplatform.com/" target="_blank">http://www.exoplatform.com</a></p>
<p>Mauricio Salatino é CTO na PlugTree (<a href="http://www.plugtree.com/" target="_blank">http://www.plugtree.com</a>), uma empresa especializada no fornecimento de soluções usando a plataforma Drools com escritórios em Miami, EUA e Buenos Aires, Argentina. Maurício é committer no projeto Drools, e vem desenvolvendo inúmeros projetos com os conceitos de Motor de Regras, CEP(Complex Event Process) BPM e portais com Alfresco, autor do livro: jBPM Developer Guide pela PacktBuk, é o fundador do grupo de usuários JBoss da Argentina(<a href="http://www.jbug.ar/" target="_blank">http://www.jbug.ar</a>), é formado em Engenharia de Sistemas pela Universidade de Mendonza &#8211; Argentina, escreve regularmente em seu blog: <a href="http://salaboy.wordpress.com/" target="_blank">http://salaboy.wordpress.com</a></p>
<p>Confira a Agenda completa aqui: <a href="http://www.jbossinbossa.com.br/2010/agenda.html" target="_blank">http://www.jbossinbossa.com.br/2010/agenda.html</a></div>
<div style="font-weight: bold; font-size: 12px;">Ver mais detalhes e RSVP em JBoss Brasil:</div>
<p><a href="http://jbossbrasil.ning.com/events/event/show?id=2234825%3AEvent%3A19199&amp;xgi=48yfZiTpQVlyHY&amp;xg_source=msg_invite_event" target="_blank">http://jbossbrasil.ning.com/events/event/show?id=2234825%3AEvent%3A19199&amp;xgi=48yfZiTpQVlyHY&amp;xg_source=msg_invite_event</a></p>
<p><script type="text/javascript" src="http://wanimoto.clearspring.com/o/46928cc51133af17/4b6a1215bfe20646/46928cc51133af17/731a36ad/-cpid/38cabf42c4e0bff6/-EMH/240/-EMW/432/widget.js"></script></p>
<p>É um evento bem interessante e com certeza contribuirá bastante para arquitetos e desenvolvedores.</p>
<p>[]s,</p>
<p>Samuel</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.portalarquiteto.com.br/?feed=rss2&amp;p=531</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>15 Práticas Para Um Analista de Qualidade Altamente Eficaz</title>
		<link>http://www.portalarquiteto.com.br/?p=526</link>
		<comments>http://www.portalarquiteto.com.br/?p=526#comments</comments>
		<pubDate>Tue, 20 Apr 2010 10:00:28 +0000</pubDate>
		<dc:creator>Eduardo Negrão</dc:creator>
				<category><![CDATA[ENGENHARIA DE SOFTWARE]]></category>
		<category><![CDATA[TESTES]]></category>

		<guid isPermaLink="false">http://www.portalarquiteto.com.br/?p=526</guid>
		<description><![CDATA[



Os testes de software são processos  integrantes de toda e qualquer metodologia de software, basicamente são  responsáveis por executar e garantir o sucesso de dois princípios  básicos:


VALIDAÇÃO = garante que se está  construindo CERTO O PRODUTO;



VERIFICAÇÃO = garante que se está  construindo O PRODUTO CERTO;




Ou seja, a Validação está  [...]]]></description>
			<content:encoded><![CDATA[<div id=HOTWordsTxt name=HOTWordsTxt><p style="clear: both;text-align: center">
<p style="clear: both;text-align: center"><a href="http://1.bp.blogspot.com/_vX7bwTP1U5E/S7LRaPqUb2I/AAAAAAAAAFI/sZcY41Q0Oss/s1600/testes_de_software.png"><img src="http://1.bp.blogspot.com/_vX7bwTP1U5E/S7LRaPqUb2I/AAAAAAAAAFI/sZcY41Q0Oss/s400/testes_de_software.png" border="0" alt="" width="400" height="145" /></a></p>
<div></div>
<div style="text-align: justify">
<p>Os testes de software são processos  integrantes de toda e qualquer metodologia de software, basicamente são  responsáveis por executar e garantir o sucesso de dois princípios  básicos:</p></div>
<div>
<div style="text-align: justify">
<p><strong>VALIDAÇÃO</strong> = garante que se está  construindo <strong>CERTO O PRODUTO</strong>;</div>
</div>
<div>
<div style="text-align: justify">
<p><strong>VERIFICAÇÃO</strong> = garante que se está  construindo <strong>O PRODUTO CERTO</strong>;</div>
</div>
<div></div>
<div>
<div style="text-align: justify">
<p>Ou seja, a <strong>Validação</strong> está  intimamente ligada à conformidade com os <strong>requisitos</strong> de negócio do  sistema. Já a <strong>Verificação</strong> está ligada ao processo de <strong>codificação</strong> correta do sistema, prevenindo-o de erros e falhas.</div>
</div>
<div>
<div style="text-align: justify">
<p>Baseado nesses princípios e na busca de  que o mesmos estejam nos projetos de maneira efetiva, eu gostaria de  expor, de maneira bem genérica, as principais práticas de um  profissional responsável por executar e gerenciar o processo de testes  em projetos de software. Tais práticas são consenso de mercado e  indicações de sucesso no processo de testes, o que indica que o  profissional que as adota pode ser considerado um profissional altamente  eficaz. Logo, se você, profissional da área de testes, almeja obter  êxito em sua profissão, fique ligado às dicas! <img src='http://www.portalarquiteto.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </div>
<div>
<div style="text-align: justify">
<p>Vamos então a elas:</p></div>
</div>
<div>
<div style="text-align: justify">
<p>1 &#8211; Prepare um <strong>documento de abordagem  de teste</strong> e plano de qualidade;</div>
</div>
<div>
<div style="text-align: justify">
<p>2 -<strong> Obtenha a aprovação</strong> durante o planejamento dos testes;</div>
</div>
<div>
<div style="text-align: justify">
<p>3 &#8211; Defina os <strong>ambientes de teste</strong> necessários e <strong>garanta a clareza na execução</strong> dos testes;</div>
</div>
<div>
<div style="text-align: justify">
<p>4 &#8211; Documente o <strong>gerenciamento de  configuração</strong> e garanta a <strong>rastreabilidade</strong>;</div>
</div>
<div>
<div style="text-align: justify">
<p>5 &#8211; Separe os <strong>testes funcionais</strong> de <strong>testes operacionais</strong> e de <strong>performance</strong>;</div>
</div>
<div>
<div style="text-align: justify">
<p>6 &#8211; Estabeleça <strong>frameworks para a  melhoria contínua</strong> para o processo de testes;</div>
</div>
<div>
<div style="text-align: justify">
<p>7 &#8211; Tenha <strong>usuários de negócio  envolvidos</strong> para identificar as regras-chave para o processo de  descoberta de condições;</div>
</div>
<div>
<div style="text-align: justify">
<p>8  &#8211; Use desenvolvimento de <strong>scripts de testes e revisã</strong><strong>o</strong>;</div>
</div>
<div>
<div style="text-align: justify">
<p>9 &#8211; Faça <strong>testes de regressão</strong>;</div>
</div>
<div>
<div style="text-align: justify">
<p>10 &#8211; <strong>Automatize o rastreamento de  problemas</strong> e outros itens que requerem um vínculo;</div>
</div>
<div>
<div style="text-align: justify">
<p>11 &#8211; Use <strong>ferramentas de workflow</strong> para construção de rastreamento e atividades de teste;</div>
</div>
<div>
<div style="text-align: justify">
<p>12 &#8211; Estabeleça uma <strong>abordagem de  reporte</strong> que permita exportar para <strong>dashboards de métricas </strong>voltadas para  os gerentes, certamente eles vão te cobrar isso!</div>
</div>
<div>
<div style="text-align: justify">
<p>13 &#8211; Faça a <strong>arquitetura de processos  de testes e ambientes</strong> para existir durante <strong>toda a vida da  aplicação</strong>;</div>
</div>
<div>
<div style="text-align: justify">
<p>14 &#8211; Desenvolva um <strong>f</strong><strong>ramework  para testes de regressão</strong> e construa <strong>softwares de testes  automatizados</strong> que deixem claro o <strong>Retorno Sobre Investimento</strong> do projeto, conhecido também, do inglês, ROI (Return On Investment);</div>
</div>
<div>
<div style="text-align: justify">
<p>15 &#8211; E por último, mas não menos  importante: Rigorosamente, <strong>organize os dados de teste</strong> e aplique <strong>controle  de versão</strong>.</div>
</div>
<div>
<div style="text-align: justify">
<p>E então, como é implementado o processo  de testes em seus projetos? Há algo semelhante com o comentado aqui?  Você, profissional de qualidade, se preocupa com tais práticas? Você  teria mais alguma boa prática para complementar este post?</p></div>
</div>
<div>
<div style="text-align: justify">
<p>É isso pessoal, espero que aproveitem as  dicas.</p></div>
</div>
<div>
<div style="text-align: justify">
<p>Por favor, não deixem de opinar sobre o  que foi escrito! <img src='http://www.portalarquiteto.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </div>
</div>
<div>
<div style="text-align: justify">
<p>Um  grande abraço e até o próximo artigo!</p></div>
</div>
<div>
<div style="text-align: justify">
<p>Eduardo Negrão &#8211; <a href="http://portalengenhariadesoftware.blogspot.com" target="_blank">http://portalengenhariadesoftware.blogspot.com</a></div>
</div>
<div>
<div style="text-align: justify">
<p>.</p></div>
</div>
<div></div>
</div>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.portalarquiteto.com.br/?feed=rss2&amp;p=526</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>O padrão Factory Method</title>
		<link>http://www.portalarquiteto.com.br/?p=507</link>
		<comments>http://www.portalarquiteto.com.br/?p=507#comments</comments>
		<pubDate>Tue, 13 Apr 2010 01:25:18 +0000</pubDate>
		<dc:creator>Carlos Eduardo Ferreira</dc:creator>
				<category><![CDATA[PADRÕES DE PROJETO]]></category>
		<category><![CDATA[DESENVOLVIMENTO]]></category>

		<guid isPermaLink="false">http://www.portalarquiteto.com.br/?p=507</guid>
		<description><![CDATA[Olá pessoal,
Hoje vamos ver um pouco como funciona o padrão Factory Method. Este é um padrão de Criação (Creational Pattern) e lida com o problema de criação de objetos.
Problema
Este padrão é utilizado quando você deseja criar um objeto sem especificar qual a classe vai ser utilizada. O padrão resolve isso definindo uma interface para criar [...]]]></description>
			<content:encoded><![CDATA[<div id=HOTWordsTxt name=HOTWordsTxt><p>Olá pessoal,</p>
<p>Hoje vamos ver um pouco como funciona o padrão Factory Method. Este é um padrão de Criação (Creational Pattern) e lida com o problema de criação de objetos.</p>
<p><strong>Problema</strong></p>
<p>Este padrão é utilizado quando você deseja criar um objeto sem especificar qual a classe vai ser utilizada. O padrão resolve isso definindo uma interface para criar um objeto, mas deixando as subclasses decidirem que classe instanciar.</p>
<div id="attachment_508" class="wp-caption alignnone" style="width: 310px"><img class="size-medium wp-image-508" src="http://www.portalarquiteto.com.br/wp-content/uploads/2010/04/FactoryMethod_GOF-300x171.GIF" alt="Figura 1: Diagrama de Classes para o Factory Method." width="300" height="171" /><p class="wp-caption-text">Figura 1: Diagrama de Classes para o Factory Method.</p></div>
<p>Utilizando nosso exemplo anterior (veja Abstract Factory) no nosso código de uma aplicação GED poderíamos utilizar o padrão Factory Method junto com o Abstract Factory. Com o Abstract Factory nos criamos as familias de objetos relacionados e com o Factory Method nos criamos a fabrica que realmente vai instanciar o classe. Ou seja, nós delegamos a factory a responsabilidade de escolher que classe instanciar.</p>
<div id="attachment_510" class="wp-caption alignnone" style="width: 524px"><img class="size-full wp-image-510" src="http://www.portalarquiteto.com.br/wp-content/uploads/2010/04/FactoryMethod_exemplo.GIF" alt="Figura 2: Diagrama de Classes para o Factory Method do exemplo." width="514" height="392" /><p class="wp-caption-text">Figura 2: Diagrama de Classes para o Factory Method do exemplo.</p></div>
<p><strong>Implementação</strong></p>
<p>Observe que modificamos as factorys do Abstract Factory (compare com o post sobre Factory Method) para agora chamar a respectiva Factory Method. Classes modificadas:<br />
PdfDocumentFactory, TxtDocumentFactory.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.ged.abstractfactory.concrete</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.ged.abstractfactory.interfaces.DocumentFactory</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.ged.abstractfactory.interfaces.DocumentReader</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.ged.abstractfactory.interfaces.DocumentWriter</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.ged.factorymethod.DocumentReaderFactory</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.ged.factorymethod.DocumentWriterFactory</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> PdfDocumentFactory <span style="color: #000000; font-weight: bold;">implements</span> DocumentFactory
<span style="color: #009900;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> DocumentReader createDocumentReader<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;PdfDocumentFactory.createDocumentReader ::: PDF&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// AQUI ESTA A NOSSA FACTORY METHOD</span>
		<span style="color: #000000; font-weight: bold;">return</span> DocumentReaderFactory.<span style="color: #006633;">getReader</span><span style="color: #009900;">&#40;</span> DocumentFactory.<span style="color: #006633;">PDF</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> DocumentWriter createDocumentWriter<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;PdfDocumentFactory.createDocumentWriter ::: PDF&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// AQUI ESTA A NOSSA FACTORY METHOD</span>
		<span style="color: #000000; font-weight: bold;">return</span> DocumentWriterFactory.<span style="color: #006633;">getWriter</span><span style="color: #009900;">&#40;</span> DocumentFactory.<span style="color: #006633;">PDF</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.ged.abstractfactory.concrete</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.ged.abstractfactory.interfaces.DocumentFactory</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.ged.abstractfactory.interfaces.DocumentReader</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.ged.abstractfactory.interfaces.DocumentWriter</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.ged.factorymethod.DocumentReaderFactory</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.ged.factorymethod.DocumentWriterFactory</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TxtDocumentFactory <span style="color: #000000; font-weight: bold;">implements</span> DocumentFactory
<span style="color: #009900;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> DocumentReader createDocumentReader<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;TxtDocumentFactory.createDocumentReader ::: TXT&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// AQUI ESTA A NOSSA FACTORY METHOD</span>
		<span style="color: #000000; font-weight: bold;">return</span> DocumentReaderFactory.<span style="color: #006633;">getReader</span><span style="color: #009900;">&#40;</span> DocumentFactory.<span style="color: #006633;">TXT</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> DocumentWriter createDocumentWriter<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;TxtDocumentFactory.createDocumentWriter ::: TXT&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// AQUI ESTA A NOSSA FACTORY METHOD</span>
		<span style="color: #000000; font-weight: bold;">return</span> DocumentWriterFactory.<span style="color: #006633;">getWriter</span><span style="color: #009900;">&#40;</span> DocumentFactory.<span style="color: #006633;">TXT</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.ged.factorymethod</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.ged.abstractfactory.interfaces.DocumentReader</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #000000; font-weight: bold;">class</span> ReaderFactory
<span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> DocumentReader getReader<span style="color: #009900;">&#40;</span> <span style="color: #003399;">String</span> readerType <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.ged.factorymethod</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.ged.abstractfactory.interfaces.DocumentWriter</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #000000; font-weight: bold;">class</span> WriterFactory
<span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> DocumentWriter getWriter<span style="color: #009900;">&#40;</span> <span style="color: #003399;">String</span> readerType <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.ged.factorymethod</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.ged.abstractfactory.concrete.PdfDocumentReader</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.ged.abstractfactory.concrete.TxtDocumentReader</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.ged.abstractfactory.interfaces.DocumentFactory</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.ged.abstractfactory.interfaces.DocumentReader</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> DocumentReaderFactory <span style="color: #000000; font-weight: bold;">extends</span> ReaderFactory
<span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> DocumentReader getReader<span style="color: #009900;">&#40;</span> <span style="color: #003399;">String</span> readerType <span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> readerType <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> readerType.<span style="color: #006633;">equalsIgnoreCase</span><span style="color: #009900;">&#40;</span>  DocumentFactory.<span style="color: #006633;">TXT</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> TxtDocumentReader<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> readerType <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> readerType.<span style="color: #006633;">equalsIgnoreCase</span><span style="color: #009900;">&#40;</span>  DocumentFactory.<span style="color: #006633;">PDF</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> PdfDocumentReader<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.ged.factorymethod</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.ged.abstractfactory.concrete.PdfDocumentWriter</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.ged.abstractfactory.concrete.TxtDocumentWriter</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.ged.abstractfactory.interfaces.DocumentFactory</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.ged.abstractfactory.interfaces.DocumentWriter</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> DocumentWriterFactory <span style="color: #000000; font-weight: bold;">extends</span> WriterFactory
<span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> DocumentWriter getWriter<span style="color: #009900;">&#40;</span> <span style="color: #003399;">String</span> readerType <span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> readerType <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> readerType.<span style="color: #006633;">equalsIgnoreCase</span><span style="color: #009900;">&#40;</span> DocumentFactory.<span style="color: #006633;">TXT</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> TxtDocumentWriter<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">else</span>  <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> readerType <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> readerType.<span style="color: #006633;">equalsIgnoreCase</span><span style="color: #009900;">&#40;</span> DocumentFactory.<span style="color: #006633;">PDF</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> PdfDocumentWriter<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong> Utilizações comuns</strong></p>
<p>Utilize quando quiser postergar a instanciação de suas classes.</p>
<p>Uma classe quer que suas subclasses especifiquem os objetos que criam.</p>
<p>Quando a escolha de qual classe instanciar for tomada em tempo de execução.</p>
<p><strong>Conseqüências</strong></p>
<p>Segundo GoF o padrão Abstract Factory tem as seguintes vantagens e desvantagens:</p>
<p>- elimina a necessidade de anexar classes especificas das aplicações no código</p>
<p>- fornece um gancho para as subclasses. A criação de classes e subclasses se torna mais</p>
<p>flexível.</p>
<p>- como desvantagem podemos citar o fato de que podemos ter que criar varias subclasses da classe Creator apenas para criar um ConcreteProduct.</p>
<p><strong>Conclusões</strong></p>
<p>O padrão Factory Method é um velho conhecido dos programadores Java. Ele esta presente em Collections. Em  Collections o método iterator é uma Factory Method. Pense aqui: ele cria um objeto, retorna uma interface, é implementado por várias classes. Este padrão é justamente sobre isso: diversas classes que implementam a mesma operação, retornam as mesma interface (ou classe abstrata) mas retornam diferentes implementações.</p>
<p>Por hoje é só pessoal.</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.portalarquiteto.com.br/?feed=rss2&amp;p=507</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Performance de aplicações WEB</title>
		<link>http://www.portalarquiteto.com.br/?p=490</link>
		<comments>http://www.portalarquiteto.com.br/?p=490#comments</comments>
		<pubDate>Mon, 22 Mar 2010 10:00:11 +0000</pubDate>
		<dc:creator>Samuel Delfim</dc:creator>
				<category><![CDATA[PERFORMANCE]]></category>
		<category><![CDATA[DESENVOLVIMENTO]]></category>
		<category><![CDATA[JAVA]]></category>
		<category><![CDATA[WEB]]></category>

		<guid isPermaLink="false">http://www.portalarquiteto.com.br/?p=490</guid>
		<description><![CDATA[Olá pessoal,
Tenho encontrado constantemente sites com problemas sérios de performance. Algumas das vezes temos problemas estruturais sérios, mas algumas vezes os problemas podem ser simples de resolver e pequenos ajustes representam grande melhoria na experiência do usuário.
Quando dizemos performance de aplicações, logo os desenvolvedores pensam em grandes mudanças estruturas como cluster, melhorias na JVM, máquinas [...]]]></description>
			<content:encoded><![CDATA[<div id=HOTWordsTxt name=HOTWordsTxt><div class="wp-caption aligncenter" style="width: 484px"><img title="Performance" src="http://www.portalarquiteto.com.br/wp-content/uploads/2010/03/ferrari_enzo-251-300x225.jpg" alt="Performance" width="474" height="355" /><p class="wp-caption-text">Performance</p></div>
<p>Olá pessoal,</p>
<p>Tenho encontrado constantemente sites com problemas sérios de performance. Algumas das vezes temos problemas estruturais sérios, mas algumas vezes os problemas podem ser simples de resolver e pequenos ajustes representam grande melhoria na experiência do usuário.</p>
<p>Quando dizemos performance de aplicações, logo os desenvolvedores pensam em grandes mudanças estruturas como cluster, melhorias na JVM, máquinas novas, cache de banco de dados e outras. Isto também são melhoras importantes, mas quando se trata de aplicações web, a percepção da performance pelo usuário, pode ser melhorada por otimizações mais simples como mudanças no front-end da aplicação.</p>
<p>Podemos encontrar as melhores práticas sobre performance de aplicações web em <a href="http://developer.yahoo.com/performance/rules.html">http://developer.yahoo.com/performance/rules.html</a>. Entre as dicas descritas no documento acima temos:</p>
<p>* Fazer menos requisições HTTP</p>
<p>* Adicionar um cabeçalho “Expires” na resposta HTTP</p>
<p>* Utilizar Gzip para compactar os componentes da página</p>
<p>* Colocar os Stylesheets no topo da página</p>
<p>* Colocar os Scripts no fim da página</p>
<p>* Evitar CSS Expressions</p>
<p>* Colocar os códigos JavaScript e CSS em arquivos externos</p>
<p>* Reduzir DNS Lookups</p>
<p>* Compactar os códigos JavaScript</p>
<p>* Remover Scripts duplicados</p>
<p>* Evitar Redirects</p>
<p>* Configurar as ETags</p>
<p>* Make Ajax Cacheable</p>
<p>Uma ferramenta que auxilia bastante é o addon do mozilla YSlow que é desenvolvido pela Yahoo. Este addon analisa com base nas melhores práticas documentadas no artigo com link acima quais regras estão ou não sendo seguidas.</p>
<p>Uma dica que me ajudou bastante em algumas aplicações que trabalhei foi a de habilitar a compressão de páginas. Existem páginas que são grandes, o que faz com que o acesso seja lento em conexões de rede ruins.</p>
<p>Esta compressão de página basicamente troca o requisito banda por CPU. Os passos realizados para a compressão são os seguintes:</p>
<p>1 &#8211; O browser do cliente faz uma requisição e envia para o servidor no cabeçalho que o browser aceita arquivos comprimidos.</p>
<p>2 &#8211; O servidor verifica que o browser que fez a requisição aceita arquivos comprimidos.</p>
<p>3 &#8211; O servidor comprime a página e envia para o cliente.</p>
<p>4 &#8211; O cliente descompacta a página recebida e exibe para o usuário.</p>
<p>Podemos utilizar para a compressão de página o apache com o módulo mod_deflate. Para explicações mais detalhadas sobre como funciona o mod_deflate verifiquem a documentação em <a href="http://httpd.apache.org/docs/2.0/mod/mod_deflate.html">http://httpd.apache.org/docs/2.0/mod/mod_deflate.html</a>.</p>
<p>É isto ai pessoal. Espero que vocês sigam as orientações, para o bem de suas aplicações e de seus usuários.</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 1034px; width: 1px; height: 1px; overflow: hidden;"><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.13cm; line-height: 100%; page-break-before: auto } --></p>
<p class="western" align="JUSTIFY"><span style="font-size: xx-small;">Este addon analisa com base nas melhores práticas documentadas no artigo com link acima quais regras estão ou não sendo seguidas.</span></p>
</div>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.portalarquiteto.com.br/?feed=rss2&amp;p=490</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Capacidades da Arquitetura Ideal</title>
		<link>http://www.portalarquiteto.com.br/?p=459</link>
		<comments>http://www.portalarquiteto.com.br/?p=459#comments</comments>
		<pubDate>Tue, 16 Mar 2010 10:00:52 +0000</pubDate>
		<dc:creator>Eduardo Negrão</dc:creator>
				<category><![CDATA[ARQUITETURA DE SISTEMAS]]></category>
		<category><![CDATA[ARQUITETURA]]></category>
		<category><![CDATA[ENGENHARIA DE SOFTWARE]]></category>

		<guid isPermaLink="false">http://www.portalarquiteto.com.br/?p=459</guid>
		<description><![CDATA[
Gostaria de abordar hoje sobre  as capacidades que uma arquitetura bem planejada deve contemplar para  proporcionar bons índices de qualidade. Este tema se torna extremamente  importante se olharmos sob a ótica de que a qualidade afeta diretamente a  satisfação do cliente e envolvidos com o  sistema, sendo um ponto  [...]]]></description>
			<content:encoded><![CDATA[<div id=HOTWordsTxt name=HOTWordsTxt><div style="clear: both;text-align: center"><a href="http://2.bp.blogspot.com/_vX7bwTP1U5E/S5WmgxZnqDI/AAAAAAAAAFA/Fu5Ag6a3AhM/s1600-h/capacidades_arquitetura.jpg"><img src="http://2.bp.blogspot.com/_vX7bwTP1U5E/S5WmgxZnqDI/AAAAAAAAAFA/Fu5Ag6a3AhM/s400/capacidades_arquitetura.jpg" border="0" alt="" width="400" height="392" /></a></div>
<div style="text-align: justify">Gostaria de abordar hoje sobre  as capacidades que uma arquitetura bem planejada deve contemplar para  proporcionar bons índices de qualidade. Este tema se torna extremamente  importante se olharmos sob a ótica de que a qualidade afeta diretamente a  satisfação do cliente e envolvidos com o  sistema, sendo um ponto  fundamental para o sucesso de um projeto de software.</div>
<div style="text-align: justify">Foram eleitas basicamente as  seguintes 11 capacidades:</div>
<div style="text-align: justify"><strong>Disponibilidade</strong></div>
<div style="text-align: justify"><strong><br />
</strong></div>
<div style="text-align: justify">É a capacidade do sistema se  manter no ar para uso devido. Diz-se que o sistema possui alta  disponibilidade quando se mantém disponível a maior parte do tempo.  Quando se contrata serviços de infra-estrutura, geralmente é acorda um  percentual de disponibilidade que tal infra deve garantir, podendo pagar  multas caso não cumpra o acordo, são as chamadas SLA&#8217;s de  disponibilidade.</div>
<div style="text-align: justify"><strong>Robustez</strong></div>
<div style="text-align: justify"><strong><br />
</strong></div>
<div style="text-align: justify">É a característica pela qual se  mede o nível de tolerância a falhas do sistema. O software deve ser  capaz de prever situações inusitadas vindas de seus usuários e reagir  com medidas que o mantenha estável, ou seja, sem apresentar falhas.</div>
<div style="text-align: justify"><strong>Gerenciabilidade<br />
</strong></div>
<div style="text-align: justify">É a capacidade que mede o quão  um sofware é configurável. A configuração dos níveis de logs gerados por  um determinado software é um bom exemplo disso.</div>
<div style="text-align: justify"><strong>Flexibilidade</strong></div>
<div style="text-align: justify"><strong><br />
</strong></div>
<div style="text-align: justify">Característica inerente à  maneira em como um determinado software se comporta à mudanças, tanto  arquiteturais quanto funcionais. Por exemplo, se um software hoje acessa  uma base de dados Oracle, diz-se que ele é flexível caso seja possível  mudá-lo para acessar uma base de dados SQL Server sem que para isso  sejam necessárias grandes alterações em seu código-fonte.</div>
<div style="text-align: justify"><strong>Desempenho</strong></div>
<div style="text-align: justify"><strong><br />
</strong></div>
<div style="text-align: justify">Esta característica está  relacionada à utilização de recursos, como por exemplo, o tempo de  processamento de uma grande quantidade de mensagens em uma fila JMS ou o  tempo de processamento de uma consulta no banco de dados.</div>
<div style="text-align: justify"><strong>Capacidade</strong></div>
<div style="text-align: justify"><strong><br />
</strong></div>
<div style="text-align: justify">Se refere às limitações impostas  ao sistema, com o que o sistema deve suportar. Por exemplo: um sistema  deve suportar 500 acessos simultâneos.</div>
<div style="text-align: justify"><strong>Resiliência</strong></div>
<div style="text-align: justify"><strong><br />
</strong></div>
<div style="text-align: justify">Este nome um tanto quanto  &#8220;exótico&#8221; se refere ao grau de estabilidade do sistema mediante a picos  de processamentos. Exemplo: um determinado sistema tem que suportar uma  carga durante 3 horas e depois voltar ao seu estado normal sem sofrer  quedas ou gerar defeitos.</div>
<div style="text-align: justify"><strong>Escalabilidade</strong></div>
<div style="text-align: justify"><strong><br />
</strong></div>
<div style="text-align: justify">É a capacidade de um determinado  sistema ser flexível a ponto de prever o seu crescimento, ou seja,  possbilita o seu incremento de funcionalidade e capacidades sem se  tornar obsoleto, acompanhando sempre as necessidades do usuário.</div>
<div style="text-align: justify"><strong>Extensibilidade</strong></div>
<div style="text-align: justify"><strong><br />
</strong></div>
<div style="text-align: justify">É a capacidade que o sistema tem  de crescer pela adição de novos componentes e que, muitas vezes,  permita ao sistema fazer algo que ele já faz, mas de forma diferente. O  polimorfismo em classes é um bom exemplo de extensibilidade em sistemas  orientados a objetos, sendo possível através do uso de programação para  interfaces e  nunca para classes com implementação concreta.</div>
<div style="text-align: justify"><strong>Reusabilidade</strong></div>
<div style="text-align: justify"><strong><br />
</strong></div>
<div style="text-align: justify">Permite que um determinado  sistema seja usado em contextos diferentes, ou então, que seus  componentes sejam usados também em outras aplicações. Este tipo de  reusabilidade de componentes facilita muito o desenvolvimento de  aplicações corporativas, pois, proporciona uma maior facilidade de  manutenção e ganho na produtividade do software.</div>
<div style="text-align: justify"><strong>Segurança</strong></div>
<div style="text-align: justify"><strong><br />
</strong></div>
<div style="text-align: justify">É a característica que permite  avaliar o quanto um sistema é protegido, dadas as suas condições de  exposição, contra ataques ou falhas internas ou externas que gerem  inconsistências em suas informações ou outros tipos de defeitos,  compromentendo a todas as outras capacidades aqui citadas.</div>
<div style="text-align: justify">Um bom sistema deve prover condições de  segurança nos quisitos autenticidade,  confidencialidade,  integridade e  disponibilidade.</div>
<div style="text-align: justify">Fico por aqui pessoal. Para  qualquer dúvida ou complemento das informações aqui postadas, não deixem  de postar os seus comentários.   <img src='http://www.portalarquiteto.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </div>
<div style="text-align: justify">Um grande abraço e até o próximo  post!</div>
<div style="text-align: justify">Eduardo Negrão &#8212; <a class="aligncenter" title="Portal Engenharia de Software" href="http://portalengenhariadesoftware.blogspot.com" target="_blank">http://portalengenhariadesoftware.blogspot.com</a></div>
<div style="text-align: justify">.</div>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.portalarquiteto.com.br/?feed=rss2&amp;p=459</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JEE 6 está bombando de novidades!</title>
		<link>http://www.portalarquiteto.com.br/?p=453</link>
		<comments>http://www.portalarquiteto.com.br/?p=453#comments</comments>
		<pubDate>Tue, 02 Mar 2010 09:00:00 +0000</pubDate>
		<dc:creator>Eduardo Negrão</dc:creator>
				<category><![CDATA[DESENVOLVIMENTO JAVA]]></category>
		<category><![CDATA[DESENVOLVIMENTO]]></category>
		<category><![CDATA[JAVA]]></category>

		<guid isPermaLink="false">http://www.portalarquiteto.com.br/?p=453</guid>
		<description><![CDATA[





A especificação JEE foi finalizada em Dezembro de 2009, trazendo algumas características novas e outras atualizadas para o mundo do desenvolvimento de aplicações corporativas. Temos por exemplo, a introdução de um novo conceito: a abordagem por perfis (profile approach), que foca nas divisões por áreas de interesse entre os desenvolvedores de aplicação, sendo o Web [...]]]></description>
			<content:encoded><![CDATA[<div id=HOTWordsTxt name=HOTWordsTxt><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"><br />
</span></div>
<div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="http://2.bp.blogspot.com/_vX7bwTP1U5E/S4IDo4NanCI/AAAAAAAAAEw/1btzKc09e-U/s1600-h/explosion.jpg"><span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"><img src="http://2.bp.blogspot.com/_vX7bwTP1U5E/S4IDo4NanCI/AAAAAAAAAEw/1btzKc09e-U/s400/explosion.jpg" border="0" alt="" width="347" height="277" /></span></a></div>
<div style="text-align: justify;"><span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"><br />
</span></div>
<h4 style="text-align: justify;"><span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"><span class="Apple-style-span" style="font-weight: normal;"></p>
<div class="MsoNormal" style="margin-bottom: 21.0pt; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;">A especificação JEE foi finalizada em Dezembro de 2009, trazendo algumas características novas e outras atualizadas para o mundo do desenvolvimento de aplicações corporativas. Temos por exemplo, a introdução de um novo conceito: a abordagem por perfis (profile approach), que foca nas divisões por áreas de interesse entre os desenvolvedores de aplicação, sendo o Web Profile o primeiro profile definido pelo expert group, o qual objetiva fornecer o mínimo de esforço de configuração aos desenvolvedores de aplicação web típicas. O objetivo deste post é dar uma breve descrição das novidades que pesquisei e achei mais interessantes. Espero que gostem.</span></span><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;"> </span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;">Um pouco das principais novidades do web profile:</span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;"><strong>- Servlet 3.0:</strong></span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;"><strong><br />
</strong></span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;">Em frameworks web, os servlets são comumente utilizados como um ponto de entrada da aplicação para processar as requisicões, poderiamos dizer então que eles são o núcleo de aplicações web. A nova versão 3.0 (JSR-315) oferece características inovadoras, tais como as anotações pertinentes a esses tipos de classes, tal como a @Servlet, @ServletFilter e @ServletContextListener, permitindo ao desenvolvedor, criar a classe como se fosse um POJO, uma classe simples, que não se prende à implementação das interfaces como era requerido nas versões anteriores. Com isso também são fornecidas uma maior flexibilidade e extensibilidade, já que ao integrar a sua aplicação a um framework MVC, você não precisaria de configurações extras. </span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;"><strong>- Integração entre XML&#8217;s de configuração:</strong></span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;"><strong><br />
</strong></span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;">Arquivos xml dos frameworks agora podem vir dentro de seus próprios arquivos JAR, já que temos uma interessantíssima novidade aqui: o contêiner JEE6 também agora tem a responsabilidade de &#8220;unir&#8221; todos os arquivos que se referem a fragmentos web.</span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;"><strong>- Java Server Pages (JSP) na versão 2.2;</strong></span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;"><strong><br />
</strong></span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;"><strong>- Expression Language (EL) também em sua versão 2.2;</strong></span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;"><strong><br />
</strong></span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;"><strong>- Bibliotecas padrão para o JSP (JSTL) na sua versão 1.2;</strong></span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;"><strong><br />
</strong></span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;"><strong>- Java Server Faces (JSF) na versão 2.0:</strong></span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;"><strong><br />
</strong></span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;">Desde que a release do JSF 1.x saiu, o JSF foi apontado como um dos frameworks mais promissores do mercado. A sua fama entusiasmou desenvolvedores ao redor do mundo todo, fazendo com que fosse crescendo em inúmeras características agregadas, tais como componentização, validação, navegação, suporte à internacionalização (também conhecido como i18n) entre outras. No entanto, com todas essas características benéficas, algumas falhas e desvantagens foram ficando mais evidentes com o passar do tempo, tal como o quão é considerado complicado criar tarefas simples através da criação de componentes customizados.  A versão 2.0 vêm com o objetivo de remediar tais falhas facilitando o desenvolvimento e introduzindo novas características, tais como suporte a ajax integrado, os quais eram realizados apenas por implementações específicas e não propostas pela especificação JSF em si.</span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;">Algumas das grandes novas características do JSF 2.0:</span></span></div>
<ul>
<li><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US">Composição de componentes</span><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US"> </span><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US"> </span><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US"> </span></li>
</ul>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; tab-stops: 47.0pt 72.0pt; text-autospace: none;"><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US">Para implementar componentes customizados utilizando JSF 1.x era realmente uma tarefa nada simples. Você teria que implementar um componente visual (UI componente) e a classe tag, com a opção também de um Renderer para a marcação e então configurar tudo isso dentro do arquivo faces-config.xml e arquivos tld (Ufssss pausa pra retomar o ar!!!). JSF 2.0 simplica isso tudo através da abordagem de componentes compostos introduzidas com o Facelets.</span><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US"> </span><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US"> </span><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US"> </span></div>
<ul>
<li><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US">Suporte integrado a Ajax</span><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US"> </span><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US"> </span><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US"> </span></li>
</ul>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; tab-stops: 47.0pt 72.0pt; text-autospace: none;"><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US"> </span><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US">Agora você pode utilizar-se dos poderes do ajax com toda sua API e infra-estrutura através das tags f:ajax sem se importar com a tecnologia em particular que está realizando essa implementação.</span><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US"> </span><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US"> </span><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US"> </span></div>
<ul>
<li><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US">Manutenção de estado de objetos</span><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US"> </span><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US"> </span><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US"> </span></li>
</ul>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; tab-stops: 47.0pt 72.0pt; text-autospace: none;"><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US">JSF 2.0 vem com uma solução para manipular requisições particulares com classes tais como PartialViewContext e PartialStateHolder, fazendo o uso de mecanismos responsáveis por guardar o estado dos objetos manipulados nessas requisições parciais. Isto já havia sido implementado antes pelo uso do <a href="http://myfaces.apache.org/trinidad/index.html"><span style="color: #382076; text-decoration: none;">Apache Trinidad</span></a>, porém, estas novas classes provêm uma maneira mais elegante de realizar tal manipulação. O objetivo é ter uma versão &#8220;leve&#8221; do estado salvo para ir e voltar nas navegações de páginas web.</span><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US"> </span><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US"> </span><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US"> </span></div>
<ul>
<li><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US">Novos escopos</span><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US"> </span><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US"> </span><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US"> </span></li>
</ul>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; tab-stops: 47.0pt 72.0pt; text-autospace: none;"><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US">Em adição ao escopo de página (page), requisição (request), sessão (session) e aplicação (application), JSF 2.0 também introduz os chamados escopos View e Flash. Os beans cujo escopo é de View têm um ciclo de vida que é maior que uma requisição, mas é menor que beans no escopo de sessão. Já os escopos Flash são como os escopos View que irão viver dentro de uma determinada view, incluindo redirecionamentos, e que serão removidos se você os estiver movendo para uma outra view.</span><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US"> </span><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US"> </span><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US"> </span></div>
<ul>
<li><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US">Navegação</span><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US"> </span><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US"> </span><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US"> </span></li>
</ul>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; tab-stops: 47.0pt 72.0pt; text-autospace: none;"><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US">No JSF 1.x toda regra de navegação deveria ser adicionada ao facez-config.xml. Com a versão 2.0, navegações implícitas também podem ser usadas, no caso de uma saída retornada por um método do bean corresponder a um view id de mesmo nome. Agora também é possível se fazer navegações condicionais dentros das tags navigation-case através de marcações de expressões regulares dentro do face-config. A versão 2.0 também provê facilidades para requisições via método GET para os componentes h:link and h:button, suportando a integração de parâmetros na requisição. O benefício de se usar tais componentes é o de tornar suas páginas passíveis de serem adicionadas aos favoritos (bookmark).</span><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US"> </span><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US"> </span><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US"> </span></div>
<ul>
<li><span class="Apple-style-span" style="font-size: 13px;">Configuração com Annotations</span></li>
</ul>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US">Você pode agora anotar seus beans com as novas anotações @ManagedBean e pode também       especificar o escopo do bean através das anotações @RequestScoped, @SessionScoped, @ViewScoped, @NoneScoped entre outras.</span><span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;" lang="EN-US"> </span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;">Outras novidades:</span></span><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;"> </span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;"><strong>-</strong><strong> Enterprise JavaBeans (EJB) 3.1 Lite;</strong></span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;"><strong><br />
</strong></span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;"><strong>- Java Transaction API (JTA) 1.1;</strong></span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;"><strong><br />
</strong></span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;"><strong>- Java Persistence API (JPA) 2.0;</strong></span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;"><strong><br />
</strong></span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;">Na minha opinião, as principais características desta release são a nova API para queries criteria e o suporte à validações. </span></span><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;"> </span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;"><strong>- Contexts and Dependency Injection (CDI)</strong></span></span><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;"> </span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span class="Apple-style-span" style="font-size: small;"><strong><br />
</strong></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;">Em atendimento à Java Specification Request </span><a href="http://jcp.org/en/jsr/summary?id=299"><span style="color: #0329e5; text-decoration: none;"><span class="Apple-style-span" style="font-size: small;">JSR-299</span></span></a><span class="Apple-style-span" style="font-size: small;">, o propósito desta especificação é unir o modelo de componentes do JSF Managed-Beans com o modelo de componentes EJB, proporcionando um modelo de fácil implementação para aplicações web. CDI também torna possível para outros componentes JEE interagirem uns com os outros usando o design pattern Observer. Isto nos facilita, por exemplo, integrar enterprise beans com suporte transacional, através do lançamento de eventos de um para o outro. </span><a href="http://jcp.org/en/jsr/summary?id=330"><span style="color: #0028e5; text-decoration: none;"><span class="Apple-style-span" style="font-size: small;">JSR 330</span></span></a><span class="Apple-style-span" style="font-size: small;"> também se tornou parte do JEE 6, oferecendo um conjunto de anotações padrão que podem ser usadas para a injeção de dependência, como por exemplo, as @Named, @Inject, @Qualifier entre outras. A WELD é a implementação de referência para o CDI.</span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;"><strong>- Bean Validation and Hibernate Validator</strong></span></span><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;"> </span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span class="Apple-style-span" style="font-size: small;"><strong><br />
</strong></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;">A Bean Validation, </span><a href="http://jcp.org/en/jsr/detail?id=303"><span style="color: #0329e5; text-decoration: none;"><span class="Apple-style-span" style="font-size: small;">JSR 303</span></span></a><span class="Apple-style-span" style="font-size: small;">, define uma modelo de metadados e uma API para validação de beans. Sua implementação de referência é a Hibernate Validator que, em sua última versão, adiciona alguns recursos legais, tais como agrupamento de validações, integração nativa com JPA 2 e JSF 2, além de um conjunto de anotações novas.</span></span><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;"> </span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;">É isso aí pessoal, isso aqui foi só uma palinha do que de mais novo está acontecendo dentro das implementações corporativas Java, e como vocês puderam notar, JEE 6 vem bombando de novidades que aparentemente demonstram o quanto esta arquitetura vêm evoluindo em uma tendência a padronizar o que já vem sendo escrito por diversos frameworks: abordagem que exigem menos configurações e alto nível de acoplamento automático de implementações independentes. Na </span><a href="http://java.sun.com/javaee/technologies/"><span style="color: #382076; text-decoration: none;"><span class="Apple-style-span" style="font-size: small;">página da Sun</span></span></a><span class="Apple-style-span" style="font-size: small;"> vocês podem conferir a lista completa. </span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;">Agora é só esperarmos a comunidade java agitar com seus primeiros projetos para que a quantidade de exemplos e tutoriais aumentem!</span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;">E vocês, podem citar outras importantes novidades do JEE 6?</span></span><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;"> </span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;">Um grande abraço e até o próximo post! <img src='http://www.portalarquiteto.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </span></span><span style="font-family: Arial; position: relative; top: -3pt;" lang="EN-US"><span class="Apple-style-span" style="font-size: small;"> </span></span></div>
<p></span></span></h4>
<div class="blogger-post-footer">http://portalengenhariadesoftware.blogspot.com</div>
<div class="blogger-post-footer">.</div>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.portalarquiteto.com.br/?feed=rss2&amp;p=453</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>O padrão AbstractFactory</title>
		<link>http://www.portalarquiteto.com.br/?p=417</link>
		<comments>http://www.portalarquiteto.com.br/?p=417#comments</comments>
		<pubDate>Tue, 23 Feb 2010 12:19:44 +0000</pubDate>
		<dc:creator>Carlos Eduardo Ferreira</dc:creator>
				<category><![CDATA[PADRÕES DE PROJETO]]></category>
		<category><![CDATA[ENGENHARIA DE SOFTWARE]]></category>
		<category><![CDATA[JAVA]]></category>

		<guid isPermaLink="false">http://www.portalarquiteto.com.br/?p=417</guid>
		<description><![CDATA[O padrão Abstract Factory
Abstract Factory é um padrão de criação e como o nome diz &#8216;Fabrica Abstrata&#8217; este padrão é utilizado para a criação de objetos relacionados ou &#8216;família de objetos&#8217;.
Problema
Precisamos criar famílias de objetos relacionados e cada objeto de cada família tem sua implementação especifica. Você precisa garantir que dada uma situação você escolherá [...]]]></description>
			<content:encoded><![CDATA[<div id=HOTWordsTxt name=HOTWordsTxt><p><strong>O padrão Abstract Factory</strong></p>
<p>Abstract Factory é um padrão de criação e como o nome diz &#8216;Fabrica Abstrata&#8217; este padrão é utilizado para a criação de objetos relacionados ou &#8216;família de objetos&#8217;.</p>
<div id="attachment_420" class="wp-caption alignnone" style="width: 591px"><img class="size-large wp-image-420" src="http://www.portalarquiteto.com.br/wp-content/uploads/2010/02/abstractfactory-1024x658.jpg" alt="Figura 1: Diagrama de Classes para o Abstract Factory." width="581" height="372" /><p class="wp-caption-text">Figura 1: Diagrama de Classes para o Abstract Factory.</p></div>
<p><strong>Problema</strong></p>
<p>Precisamos criar famílias de objetos relacionados e cada objeto de cada família tem sua implementação especifica. Você precisa garantir que dada uma situação você escolherá a família correta de objetos que será utilizado sem misturar os objetos de famílias diferentes.</p>
<p>Imagine que você esteja desenvolvendo uma aplicação de gerenciamento de documentos (GED) e precise tratar diferentes tipos de arquivos: txt, pdf, doc e etc.</p>
<p>Dentro deste contexto você terá objetos para extração e indexação de conteúdo para cada tipo de arquivo (mime-type).</p>
<div id="attachment_423" class="wp-caption alignnone" style="width: 600px"><img class="size-large wp-image-423" src="http://www.portalarquiteto.com.br/wp-content/uploads/2010/02/documentabstractfactory-1024x627.jpg" alt="Figura 2: Diagrama de Classes para o Abstract Factory." width="590" height="361" /><p class="wp-caption-text">Figura 2: Diagrama de Classes para o Abstract Factory do nosso exemplo.</p></div>
<p><strong>Implementação</strong></p>
<p>Observe que na classe Client utiliza somente as interfaces não as implementações.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.ged.abstractfactory.interfaces</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> DocumentFactory 
<span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">String</span> TXT <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;TXT&quot;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">String</span> PDF <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;PDF&quot;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> DocumentReader createDocumentReader<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> DocumentWriter createDocumentWriter<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.ged.abstractfactory.interfaces</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.OutputStream</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> DocumentReader <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">OutputStream</span> readeFile<span style="color: #009900;">&#40;</span> <span style="color: #003399;">String</span> file <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.ged.abstractfactory.interfaces</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.InputStream</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> DocumentWriter <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> writeFile<span style="color: #009900;">&#40;</span> <span style="color: #003399;">InputStream</span> inputStream <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.ged.abstractfactory.concrete</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.ged.abstractfactory.interfaces.DocumentFactory</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.ged.abstractfactory.interfaces.DocumentReader</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.ged.abstractfactory.interfaces.DocumentWriter</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> PdfDocumentFactory <span style="color: #000000; font-weight: bold;">implements</span> DocumentFactory 
<span style="color: #009900;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> DocumentReader createDocumentReader<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span> 
	<span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;PdfDocumentFactory.createDocumentReader ::: PDF&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> PdfDocumentReader<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> DocumentWriter createDocumentWriter<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span> 
	<span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;PdfDocumentFactory.createDocumentWriter ::: PDF&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> PdfDocumentWriter<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.ged.abstractfactory.concrete</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.OutputStream</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.ged.abstractfactory.interfaces.DocumentReader</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> PdfDocumentReader <span style="color: #000000; font-weight: bold;">implements</span> DocumentReader <span style="color: #009900;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">OutputStream</span> readeFile<span style="color: #009900;">&#40;</span> <span style="color: #003399;">String</span> file <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;PdfDocumentReader.readeFile ::: PDF&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.ged.abstractfactory.concrete</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.InputStream</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.ged.abstractfactory.interfaces.DocumentWriter</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> PdfDocumentWriter <span style="color: #000000; font-weight: bold;">implements</span> DocumentWriter <span style="color: #009900;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> writeFile<span style="color: #009900;">&#40;</span><span style="color: #003399;">InputStream</span> inputStream<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;PdfDocumentWriter.writeFile ::: PDF&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.ged.abstractfactory.concrete</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.ged.abstractfactory.interfaces.DocumentFactory</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.ged.abstractfactory.interfaces.DocumentReader</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.ged.abstractfactory.interfaces.DocumentWriter</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TxtDocumentFactory <span style="color: #000000; font-weight: bold;">implements</span> DocumentFactory 
<span style="color: #009900;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> DocumentReader createDocumentReader<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span> 
	<span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;TxtDocumentFactory.createDocumentReader ::: TXT&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> TxtDocumentReader<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> DocumentWriter createDocumentWriter<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span> 
	<span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;TxtDocumentFactory.createDocumentWriter ::: TXT&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> TxtDocumentWriter<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.ged.abstractfactory.concrete</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.OutputStream</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.ged.abstractfactory.interfaces.DocumentReader</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TxtDocumentReader <span style="color: #000000; font-weight: bold;">implements</span> DocumentReader <span style="color: #009900;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">OutputStream</span> readeFile<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> file<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;TxtDocumentReader.readeFile ::: TXT&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.ged.abstractfactory.concrete</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.InputStream</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.ged.abstractfactory.interfaces.DocumentWriter</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TxtDocumentWriter <span style="color: #000000; font-weight: bold;">implements</span> DocumentWriter <span style="color: #009900;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> writeFile<span style="color: #009900;">&#40;</span><span style="color: #003399;">InputStream</span> inputStream<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// persiste arquivo baseado no inputstream</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;TxtDocumentWriter.writeFile ::: TXT&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.ged.abstractfactory.concrete</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.OutputStream</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.ged.abstractfactory.interfaces.DocumentFactory</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.ged.abstractfactory.interfaces.DocumentReader</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.ged.abstractfactory.interfaces.DocumentWriter</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Client 
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">Exception</span>
    <span style="color: #009900;">&#123;</span>
    	<span style="color: #666666; font-style: italic;">// OBSERVE QUE USAMOS AQUI APENAS AS INTEFACES</span>
	    DocumentFactory documentFactory <span style="color: #339933;">=</span>  createDocumentFactory<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;PDF&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	    DocumentWriter documentWriter <span style="color: #339933;">=</span> documentFactory.<span style="color: #006633;">createDocumentWriter</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	    documentWriter.<span style="color: #006633;">writeFile</span><span style="color: #009900;">&#40;</span> <span style="color: #000066; font-weight: bold;">null</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	    DocumentReader documentReader <span style="color: #339933;">=</span> documentFactory.<span style="color: #006633;">createDocumentReader</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	    <span style="color: #003399;">OutputStream</span> outputStream <span style="color: #339933;">=</span> documentReader.<span style="color: #006633;">readeFile</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;dados.txt&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> DocumentFactory createDocumentFactory<span style="color: #009900;">&#40;</span> <span style="color: #003399;">String</span> type <span style="color: #009900;">&#41;</span> 
    <span style="color: #009900;">&#123;</span>
    	<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> type.<span style="color: #006633;">equalsIgnoreCase</span><span style="color: #009900;">&#40;</span> DocumentFactory.<span style="color: #006633;">PDF</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
    		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> PdfDocumentFactory<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    	<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> type.<span style="color: #006633;">equalsIgnoreCase</span><span style="color: #009900;">&#40;</span> DocumentFactory.<span style="color: #006633;">TXT</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
    		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> TxtDocumentFactory<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    	<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong> </strong></p>
<p><strong>Utilizações comuns</strong></p>
<p>Utilize quando quiser ter independência de como seus objetos são criados, ou seja você deseja desacoplar sua aplicação e as famílias de objetos utilizadas por ela. Dessa forma podemos trocar a família de objetos utilizadas na aplicação sem afetar o código fonte.</p>
<p>Utilize quando quiser fornecer uma biblioteca de classes de produtos e quer revelar somente suas interfaces e as implementações.</p>
<p><strong> </strong></p>
<p><strong>Conclusões</strong></p>
<p>Embora utilizar o AbstractFactory gere um trabalho adicional (escrever produtos abstratos, fabricas abstratas, e suas respectivas implementações) , utilizar fabricas é uma boa prática de programação e ajuda a reduzir o acoplamento e conseqüentemente melhora manutenção do sistema.</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.portalarquiteto.com.br/?feed=rss2&amp;p=417</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cache de páginas com o framework EhCache</title>
		<link>http://www.portalarquiteto.com.br/?p=409</link>
		<comments>http://www.portalarquiteto.com.br/?p=409#comments</comments>
		<pubDate>Tue, 09 Feb 2010 11:00:41 +0000</pubDate>
		<dc:creator>Samuel Delfim</dc:creator>
				<category><![CDATA[PERFORMANCE]]></category>
		<category><![CDATA[CACHE]]></category>
		<category><![CDATA[DESENVOLVIMENTO]]></category>
		<category><![CDATA[JAVA]]></category>
		<category><![CDATA[JSF]]></category>

		<guid isPermaLink="false">http://www.portalarquiteto.com.br/?p=409</guid>
		<description><![CDATA[Há bastante tempo não escrevo nada. Resolvi falar agora sobre melhorias de performance que ajudam bastante a aplicação. Em sites, constantemente temos páginas que acessam várias consultas pesadas além de regras de negócio. Estas páginas quando muito acessadas causam freqüentemente problemas de desempenho na aplicação e páginas lentas.]]></description>
			<content:encoded><![CDATA[<div id=HOTWordsTxt name=HOTWordsTxt><p>Olá pessoal,</p>
<p>Há bastante tempo não escrevo nada. Resolvi falar agora sobre melhorias de performance que ajudam bastante a aplicação. Em sites, constantemente temos páginas que acessam várias consultas pesadas além de regras de negócio. Estas páginas quando muito acessadas causam freqüentemente problemas de desempenho na aplicação e páginas lentas.</p>
<p>Um dado importante para se tomar a decisão de utilizar ou não cache em páginas é a relação entre corretude e performance. Imagine o seguinte caso: Você tem uma página que possui as últimas notícias da sua empresa. Se uma nova notícia nova acaba de sair, qual o impacto da notícia demorar um pouco a mais para entrar no ar? O ganho de performance vale a pena o atraso na notícia. Se sim é interessante utilizar neste caso o cache para esta página.</p>
<p>Quando temos cenários parecidos com este podemos verificar se é possível realizar cache de páginas. O Ehcache que é um framework java possui além do cache de objetos e cache para acesso a dados com JPA, possui também cache de páginas. Este cache às vezes é mais interessante, porque uma mesma página pode possuir várias consultas e regras de negócio, o que faz com que o cache de página geralmente gere mais ganho de performance do que o cache de acesso a dados.</p>
<p>Para definir o cache de páginas é necessário primeiramente baixar os jars do ehcache disponíveis em http://ehcache.org. Entre os jars necessários é necessário baixar o módulo ehcache-web, que possui a Servlet responsável por gerenciar e guardar o cache das páginas.</p>
<p>Depois disto, no classPath (pode ser na pasta src por exemplo) deve ser adicionado o aquivo ehcache.xml com um conteúdo parecido com o abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;UTF-8&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ehcache<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;diskStore</span> <span style="color: #000066;">path</span>=<span style="color: #ff0000;">&quot;java.io.tmpdir&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;cache</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;SimplePageCachingFilter&quot;</span> <span style="color: #000066;">maxElementsInMemory</span>=<span style="color: #ff0000;">&quot;10&quot;</span></span>
<span style="color: #009900;">        <span style="color: #000066;">eternal</span>=<span style="color: #ff0000;">&quot;false&quot;</span> <span style="color: #000066;">timeToIdleSeconds</span>=<span style="color: #ff0000;">&quot;600&quot;</span> <span style="color: #000066;">timeToLiveSeconds</span>=<span style="color: #ff0000;">&quot;600&quot;</span></span>
<span style="color: #009900;">        <span style="color: #000066;">overflowToDisk</span>=<span style="color: #ff0000;">&quot;true&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
&nbsp;
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;defaultCache</span> <span style="color: #000066;">maxElementsInMemory</span>=<span style="color: #ff0000;">&quot;10&quot;</span> <span style="color: #000066;">eternal</span>=<span style="color: #ff0000;">&quot;false&quot;</span></span>
<span style="color: #009900;">        <span style="color: #000066;">overflowToDisk</span>=<span style="color: #ff0000;">&quot;false&quot;</span> <span style="color: #000066;">timeToIdleSeconds</span>=<span style="color: #ff0000;">&quot;120&quot;</span> <span style="color: #000066;">timeToLiveSeconds</span>=<span style="color: #ff0000;">&quot;120&quot;</span></span>
<span style="color: #009900;">        <span style="color: #000066;">diskPersistent</span>=<span style="color: #ff0000;">&quot;false&quot;</span> <span style="color: #000066;">diskExpiryThreadIntervalSeconds</span>=<span style="color: #ff0000;">&quot;120&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/ehcache<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Para o arquivo acima é necessário verificar o tempo de expiração do cache que é definido pela propriedade timeToLiveSeconds que representa o número de segundos do cache da página apresentada.</p>
<p>Depois, no arquivo web.xml devemos adicionar o filtro de cache para as páginas necessárias, assim como mostrado abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">&lt;!-- Filtros para cache de páginas adicionado para páginas não logadas --&gt;</span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;filter<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;filter-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>SimplePageCachingFilter<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/filter-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;filter-class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>net.sf.ehcache.constructs.web.filter.SimplePageCachingFilter<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/filter-class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/filter<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;filter-mapping<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;filter-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>SimplePageCachingFilter<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/filter-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;url-pattern<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>/index.jsf<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/url-pattern<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/filter-mapping<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;filter-mapping<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;filter-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>SimplePageCachingFilter<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/filter-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;url-pattern<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>/noticias.jsf<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/url-pattern<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/filter-mapping<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;filter-mapping<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;filter-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>SimplePageCachingFilter<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/filter-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;url-pattern<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>/rss.jsf<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/url-pattern<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/filter-mapping<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>A melhoria de performance é bastante significante. Além do cache de páginas comum é possivel também compactar as páginas, adicionar cabeçalhos, entre outros. Para mais informações visitem http://ehcache.org/documentation/web_caching.html.</p>
<p>É isto aí pessoal. Qualquer problema avisem&#8230;</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.portalarquiteto.com.br/?feed=rss2&amp;p=409</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
