Padrão Abstract Factory  XML
Índice dos Fóruns » Arquitetura de Sistemas
Autor Mensagem
spinow
Thread.start()
[Avatar]

Membro desde: 16/07/2009 20:00:33
Mensagens: 25
Offline

Olá a todos,
Já existem vários tópicos sobre esse padrão de projeto, eu sei, mas minha dúvida é um pouco mais específica.
Bom, primeiro vai o código.
Tenho assim o meu Abstract Factory:




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:


É 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...
Opinem, por favor...

Obrigado!


This message was edited 2 times. Last update was at 14/01/2010 21:02:30


powered by
[WWW]
pozzo
JavaGuru

Membro desde: 08/04/2006 11:07:20
Mensagens: 271
Localização: Curitiba
Offline

É 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.

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.

This message was edited 1 time. Last update was at 15/01/2010 09:13:43

asaudate
Virtual Machine Man
[Avatar]

Membro desde: 01/09/2007 19:31:41
Mensagens: 546
Localização: São Paulo
Offline

spinow wrote:Olá a todos,
Já existem vários tópicos sobre esse padrão de projeto, eu sei, mas minha dúvida é um pouco mais específica.
Bom, primeiro vai o código.
Tenho assim o meu Abstract Factory:




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:


É 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...
Opinem, por favor...

Obrigado!




Está quase lá... o seu método getInstance() está meio "complicado", porque se o cliente sabe que Usuário quer, como nessa linha:


então não tem porque usar factory, concorda?
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:



Assim, você anexa o input de acordo com a Factory, mas se ficar tudo na mesma classe, não tem problema.
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.



[]´s

This message was edited 2 times. Last update was at 16/01/2010 15:05:05


O dito acima não é uma verdade absoluta, não precisa cortar os pulsos se não concordar.

Entretanto, se você não quer ajuda, melhor não pedir: poupe o seu e o meu tempo.

Meu blog: http://alesaudate.wordpress.com/ - assunto do dia: O que é BPEL e qual seu propósito?
spinow
Thread.start()
[Avatar]

Membro desde: 16/07/2009 20:00:33
Mensagens: 25
Offline


Está quase lá... o seu método getInstance() está meio "complicado", porque se o cliente sabe que Usuário quer, como nessa linha:


Tem toda a razão... realmente fugiu da idéia da utilização do padrão...

Curti a idéia de passar o input, massa mesmo!


Substitua getCpf() por getDocumento


Ótima alternativa tbm!

Valew pela ajuda de todos!

This message was edited 1 time. Last update was at 26/01/2010 09:49:45


powered by
[WWW]
mario.fts
Virtual Machine Man
[Avatar]

Membro desde: 14/05/2008 09:41:06
Mensagens: 632
Localização: São Paulo - ZL
Offline

Eu prefiro algo do tipo:



Assim não precisa saber as flags, os nomes dos métodos já deixam claro o que será retornado.

This message was edited 1 time. Last update was at 26/01/2010 10:06:33


Mário Amaral Gonçalves
[Email]
Leonardo3001
Virtual Machine Man

Membro desde: 04/07/2007 18:28:58
Mensagens: 824
Offline

mario.fts wrote:Eu prefiro algo do tipo:



Assim não precisa saber as flags, os nomes dos métodos já deixam claro o que será retornado.


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.

Leonardo Veríssimo
-------------------------------------------------
Objectzilla
[WWW]
mario.fts
Virtual Machine Man
[Avatar]

Membro desde: 14/05/2008 09:41:06
Mensagens: 632
Localização: São Paulo - ZL
Offline

e passando o flag ele não sabe?

Mário Amaral Gonçalves
[Email]
asaudate
Virtual Machine Man
[Avatar]

Membro desde: 01/09/2007 19:31:41
Mensagens: 546
Localização: São Paulo
Offline

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.

[]´s

O dito acima não é uma verdade absoluta, não precisa cortar os pulsos se não concordar.

Entretanto, se você não quer ajuda, melhor não pedir: poupe o seu e o meu tempo.

Meu blog: http://alesaudate.wordpress.com/ - assunto do dia: O que é BPEL e qual seu propósito?
spinow
Thread.start()
[Avatar]

Membro desde: 16/07/2009 20:00:33
Mensagens: 25
Offline


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.


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?

powered by
[WWW]
asaudate
Virtual Machine Man
[Avatar]

Membro desde: 01/09/2007 19:31:41
Mensagens: 546
Localização: São Paulo
Offline

spinow wrote:

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.


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?


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.

[]´s

O dito acima não é uma verdade absoluta, não precisa cortar os pulsos se não concordar.

Entretanto, se você não quer ajuda, melhor não pedir: poupe o seu e o meu tempo.

Meu blog: http://alesaudate.wordpress.com/ - assunto do dia: O que é BPEL e qual seu propósito?
 
Índice dos Fóruns » Arquitetura de Sistemas
Ir para:   
Powered by JForum 2.1.8 © JForum Team