<?xml version="1.0" encoding="ISO-8859-1"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[Últimas mensagens do tópico "Padrão Abstract Factory"]]></title>
		<link>http://www.guj.com.br/posts/list/12.java</link>
		<description><![CDATA[Últimas mensagens enviadas no tópico "Padrão Abstract Factory"]]></description>
		<generator>JForum - http://www.jforum.net</generator>
			<item>
				<title>Padrão Abstract Factory</title>
				<description><![CDATA[ Olá a todos,<br /> Já existem vários tópicos sobre esse padrão de projeto, eu sei, mas minha dúvida é um pouco mais específica.<br /> Bom, primeiro vai o código.<br /> Tenho assim o meu Abstract Factory:<br /> [code]<br /> public abstract class UsuarioFactory {<br /> 	<br /> 	public abstract Usuario create();<br /> 	<br /> 	public static UsuarioFactory getInstance(Class&lt;?&gt; tipoUsuario){<br /> 		if(tipoUsuario.getSimpleName().equals(UsuarioFisico.class.getSimpleName()))<br /> 			return new UsuarioFisicoFactory();<br /> 		else if(tipoUsuario.getSimpleName().equals(UsuarioJuridico.class.getSimpleName()))<br /> 			return new UsuarioJuridicoFactory();<br /> 		else<br /> 			return null;<br /> 	}<br /> }<br /> [/code]<br /> [code]<br /> public class UsuarioFisicoFactory extends UsuarioFactory {<br /> 	UsuarioFisicoFactory() {<br /> 		<br /> 	}<br /> <br /> 	@Override<br /> 	public Usuario create() {<br /> 		return new UsuarioFisico();<br /> 	}<br /> }<br /> [/code]<br /> [code]<br /> public class UsuarioJuridicoFactory extends UsuarioFactory {<br /> 	UsuarioJuridicoFactory() {<br /> 		<br /> 	}<br /> 	<br /> 	@Override<br /> 	public Usuario create() {<br /> 		return new UsuarioJuridico();<br /> 	}<br /> }<br /> [/code]<br /> <br /> Bom, primeiro, como existem aqui vários experts no assunto, gostaria de saber se consegui assimilar o padrão, segundo, e principal, diz respeito a utilizaçao por parte do cliente:<br /> <br /> [code]<br /> UsuarioFactory objUsuarioFactory;<br /> 			Usuario objUsuario;<br /> 			String tipoPessoa = input.getString("tipo_pessoa");<br /> 			<br /> 			//Usuario Físico<br /> 			if(tipoPessoa.equals("1")){<br /> 				objUsuarioFactory = UsuarioFactory.getInstance(UsuarioFisico.class);<br /> 				objUsuario = (UsuarioFisico)objUsuarioFactory.create();<br /> 			} else {<br /> 				objUsuarioFactory = UsuarioFactory.getInstance(UsuarioJuridico.class);<br /> 				objUsuario = (UsuarioJuridico)objUsuarioFactory.create();<br /> 			}<br /> 			objUsuario.setSenha(Cryptographer.getMD5(objUsuario.getSenha()));<br /> [/code]<br /> É correto o método "create()" retornar a classe abstrata (Usuario)? Acho estranho, pois, assim teria que fazer um cast toda hora, até pq UsuarioFisico tem o método getCpf(), no qual não existe, obviamente no UsuarioJuridico...<br /> Opinem, por favor...<br /> <br /> Obrigado!<br /> <br /> <br /> ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/149417/809960/padrao-abstract-factory
</guid>
				<link>http://www.guj.com.br/prepost/149417/809960/padrao-abstract-factory
</link>
				<pubDate><![CDATA[Thu, 14 Jan 2010 20:59:21]]> GMT</pubDate>
				<author><![CDATA[ spinow]]></author>
			</item>
			<item>
				<title>Padrão Abstract Factory</title>
				<description><![CDATA[ É assim mesmo, a aplicação não deve saber qual o tipo de factory usada ou objeto retornado. O que importa é que o 'tipo certo' seja retornado.<br /> <br /> Bom, neste caso você vai ter que fazer cast. Pois o método getCpf não existe em UsuarioJuridico. Mas veja que fica mais interessante quando você tem métodos sobrescritos, e em tempo de execução, é decidido qual executar.<br /> ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/149417/810106/padrao-abstract-factory
</guid>
				<link>http://www.guj.com.br/prepost/149417/810106/padrao-abstract-factory
</link>
				<pubDate><![CDATA[Fri, 15 Jan 2010 09:12:59]]> GMT</pubDate>
				<author><![CDATA[ pozzo]]></author>
			</item>
			<item>
				<title>Padrão Abstract Factory</title>
				<description><![CDATA[ [quote=spinow]Olá a todos,<br /> Já existem vários tópicos sobre esse padrão de projeto, eu sei, mas minha dúvida é um pouco mais específica.<br /> Bom, primeiro vai o código.<br /> Tenho assim o meu Abstract Factory:<br /> [code]<br /> public abstract class UsuarioFactory {<br /> 	<br /> 	public abstract Usuario create();<br /> 	<br /> 	public static UsuarioFactory getInstance(Class&lt;?&gt; tipoUsuario){<br /> 		if(tipoUsuario.getSimpleName().equals(UsuarioFisico.class.getSimpleName()))<br /> 			return new UsuarioFisicoFactory();<br /> 		else if(tipoUsuario.getSimpleName().equals(UsuarioJuridico.class.getSimpleName()))<br /> 			return new UsuarioJuridicoFactory();<br /> 		else<br /> 			return null;<br /> 	}<br /> }<br /> [/code]<br /> [code]<br /> public class UsuarioFisicoFactory extends UsuarioFactory {<br /> 	UsuarioFisicoFactory() {<br /> 		<br /> 	}<br /> <br /> 	@Override<br /> 	public Usuario create() {<br /> 		return new UsuarioFisico();<br /> 	}<br /> }<br /> [/code]<br /> [code]<br /> public class UsuarioJuridicoFactory extends UsuarioFactory {<br /> 	UsuarioJuridicoFactory() {<br /> 		<br /> 	}<br /> 	<br /> 	@Override<br /> 	public Usuario create() {<br /> 		return new UsuarioJuridico();<br /> 	}<br /> }<br /> [/code]<br /> <br /> Bom, primeiro, como existem aqui vários experts no assunto, gostaria de saber se consegui assimilar o padrão, segundo, e principal, diz respeito a utilizaçao por parte do cliente:<br /> <br /> [code]<br /> UsuarioFactory objUsuarioFactory;<br /> 			Usuario objUsuario;<br /> 			String tipoPessoa = input.getString("tipo_pessoa");<br /> 			<br /> 			//Usuario Físico<br /> 			if(tipoPessoa.equals("1")){<br /> 				objUsuarioFactory = UsuarioFactory.getInstance(UsuarioFisico.class);<br /> 				objUsuario = (UsuarioFisico)objUsuarioFactory.create();<br /> 			} else {<br /> 				objUsuarioFactory = UsuarioFactory.getInstance(UsuarioJuridico.class);<br /> 				objUsuario = (UsuarioJuridico)objUsuarioFactory.create();<br /> 			}<br /> 			objUsuario.setSenha(Cryptographer.getMD5(objUsuario.getSenha()));<br /> [/code]<br /> É correto o método "create()" retornar a classe abstrata (Usuario)? Acho estranho, pois, assim teria que fazer um cast toda hora, até pq UsuarioFisico tem o método getCpf(), no qual não existe, obviamente no UsuarioJuridico...<br /> Opinem, por favor...<br /> <br /> Obrigado!<br /> <br /> <br /> [/quote]<br /> <br /> Está quase lá... o seu método getInstance() está meio "complicado", porque se o cliente sabe que Usuário quer, como nessa linha:<br /> <br /> [code]<br /> objUsuarioFactory = UsuarioFactory.getInstance(UsuarioJuridico.class);<br /> [/code]<br /> então não tem porque usar factory, concorda? <br /> Nesse caso (especificamente), eu diria a você criar um mapa com o input e atrelar às instâncias de factory que você quer. Por exemplo:<br /> <br /> [code]<br /> <br /> static Map&lt;String, UsuarioFactory&gt; map;<br /> <br /> static {<br />  map = new HashMap&lt;String, UsuarioFactory&gt;();<br />  map.put ("1", new UsuarioFisicoFactory());<br />  map.put ("2", new UsuarioJuridicoFactory()); <br /> }<br /> <br /> <br /> public UsuarioFactory getFactory(String input) {<br />     //Estou com preguiça de digitar getter e setter pro map =P<br />     return map.get(input);<br /> }<br /> <br /> [/code]<br /> <br /> Assim, você anexa o input de acordo com a Factory, mas se ficar tudo na mesma classe, não tem problema.<br /> Quanto ao caso do método getCpf, você poderia fazer um esquema semelhante de classes abstratas, mas com os usuários. Substitua getCpf() por getDocumento, que fica numa interface (evite usar herança!) e substitua o método na sua classe Factory, tb.<br /> <br /> <br /> <br /> []´s<br /> ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/149417/810667/padrao-abstract-factory
</guid>
				<link>http://www.guj.com.br/prepost/149417/810667/padrao-abstract-factory
</link>
				<pubDate><![CDATA[Fri, 15 Jan 2010 16:50:38]]> GMT</pubDate>
				<author><![CDATA[ asaudate]]></author>
			</item>
			<item>
				<title>Re:Padrão Abstract Factory</title>
				<description><![CDATA[ [quote]<br /> Está quase lá... o seu método getInstance() está meio "complicado", porque se o cliente sabe que Usuário quer, como nessa linha: <br /> [/quote]<br /> <br /> Tem toda a razão... realmente fugiu da idéia da utilização do padrão...<br /> <br /> Curti a idéia de passar o input, massa mesmo!<br /> <br /> [quote]<br /> Substitua getCpf() por getDocumento<br /> [/quote]<br /> <br /> Ótima alternativa tbm!<br /> <br /> Valew pela ajuda de todos!]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/149417/984091/repadrao-abstract-factory
</guid>
				<link>http://www.guj.com.br/prepost/149417/984091/repadrao-abstract-factory
</link>
				<pubDate><![CDATA[Tue, 26 Jan 2010 09:47:41]]> GMT</pubDate>
				<author><![CDATA[ spinow]]></author>
			</item>
			<item>
				<title>Re:Padrão Abstract Factory</title>
				<description><![CDATA[ Eu prefiro algo do tipo:<br /> <br /> [code]<br />  public abstract class UsuarioFactory {  <br />        <br />      public static UsuarioFactory getUsuarioFisicoFactory(){  <br />              return new UsuarioFisicoFactory();  <br />      }  <br />      <br />      public static UsuarioFactory getUsuarioJuridicoFactory(){  <br />              return new UsuarioJuridicoFactory();  <br />      }<br />  } <br /> [/code]<br /> <br /> Assim não precisa saber as flags, os nomes dos métodos já deixam claro o que será retornado.]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/149417/984118/repadrao-abstract-factory
</guid>
				<link>http://www.guj.com.br/prepost/149417/984118/repadrao-abstract-factory
</link>
				<pubDate><![CDATA[Tue, 26 Jan 2010 10:06:11]]> GMT</pubDate>
				<author><![CDATA[ mario.fts]]></author>
			</item>
			<item>
				<title>Re:Padrão Abstract Factory</title>
				<description><![CDATA[ [quote=mario.fts]Eu prefiro algo do tipo:<br /> <br /> [code]<br />  public abstract class UsuarioFactory {  <br />        <br />      public static UsuarioFactory getUsuarioFisicoFactory(){  <br />              return new UsuarioFisicoFactory();  <br />      }  <br />      <br />      public static UsuarioFactory getUsuarioJuridicoFactory(){  <br />              return new UsuarioJuridicoFactory();  <br />      }<br />  } <br /> [/code]<br /> <br /> Assim não precisa saber as flags, os nomes dos métodos já deixam claro o que será retornado.[/quote]<br /> <br /> Pode até ser. Mas aí deixaria de ser um Abstract Factory, que é um padrão que abstrai uma família de factories. Afinal, na sua implementação, o cliente sabe qual factory está sendo utilizado, o que não é a intenção.]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/149417/984131/repadrao-abstract-factory
</guid>
				<link>http://www.guj.com.br/prepost/149417/984131/repadrao-abstract-factory
</link>
				<pubDate><![CDATA[Tue, 26 Jan 2010 10:17:44]]> GMT</pubDate>
				<author><![CDATA[ Leonardo3001]]></author>
			</item>
			<item>
				<title>Re:Padrão Abstract Factory</title>
				<description><![CDATA[ e passando o flag ele não sabe?]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/149417/984135/repadrao-abstract-factory
</guid>
				<link>http://www.guj.com.br/prepost/149417/984135/repadrao-abstract-factory
</link>
				<pubDate><![CDATA[Tue, 26 Jan 2010 10:21:35]]> GMT</pubDate>
				<author><![CDATA[ mario.fts]]></author>
			</item>
			<item>
				<title>Re:Padrão Abstract Factory</title>
				<description><![CDATA[ Naquele jeito que eu passei alí em cima, não. Ele só sabe que , de acordo com o input, ele vai retornar uma factory diferente. Acontece que esse input vem do controller, que vem da view... ou seja, vai mudando. Se por acaso a view acrescentar mais valores, por exemplo, é só acrescentar uma entrada no map.<br /> <br /> []´s]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/149417/984141/repadrao-abstract-factory
</guid>
				<link>http://www.guj.com.br/prepost/149417/984141/repadrao-abstract-factory
</link>
				<pubDate><![CDATA[Tue, 26 Jan 2010 10:27:15]]> GMT</pubDate>
				<author><![CDATA[ asaudate]]></author>
			</item>
			<item>
				<title>Re:Padrão Abstract Factory</title>
				<description><![CDATA[ [quote]<br /> Naquele jeito que eu passei alí em cima, não. Ele só sabe que , de acordo com o input, ele vai retornar uma factory diferente. Acontece que esse input vem do controller, que vem da view... ou seja, vai mudando. Se por acaso a view acrescentar mais valores, por exemplo, é só acrescentar uma entrada no map.<br /> [/quote]<br /> <br /> Se eu consegui entender a necessidade do padrão Abstract Factory, acredito que esta explicação é bem válida, pois, deixa mais "genérico". Certo?]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/149417/984302/repadrao-abstract-factory
</guid>
				<link>http://www.guj.com.br/prepost/149417/984302/repadrao-abstract-factory
</link>
				<pubDate><![CDATA[Tue, 26 Jan 2010 12:53:49]]> GMT</pubDate>
				<author><![CDATA[ spinow]]></author>
			</item>
			<item>
				<title>Re:Padrão Abstract Factory</title>
				<description><![CDATA[ [quote=spinow][quote]<br /> Naquele jeito que eu passei alí em cima, não. Ele só sabe que , de acordo com o input, ele vai retornar uma factory diferente. Acontece que esse input vem do controller, que vem da view... ou seja, vai mudando. Se por acaso a view acrescentar mais valores, por exemplo, é só acrescentar uma entrada no map.<br /> [/quote]<br /> <br /> Se eu consegui entender a necessidade do padrão Abstract Factory, acredito que esta explicação é bem válida, pois, deixa mais "genérico". Certo?[/quote]<br /> <br /> Certo! Você está deixando de lado a necessidade de saber qual o produto. OK, você está acoplando a entrada com uma factory, mas como eu disse antes, não tem problema se você fizer isso num façade ou coisa assim.<br /> <br /> []´s]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/149417/984323/repadrao-abstract-factory
</guid>
				<link>http://www.guj.com.br/prepost/149417/984323/repadrao-abstract-factory
</link>
				<pubDate><![CDATA[Tue, 26 Jan 2010 13:09:22]]> GMT</pubDate>
				<author><![CDATA[ asaudate]]></author>
			</item>
	</channel>
</rss>
