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:
public abstract class UsuarioFactory {
public abstract Usuario create();
public static UsuarioFactory getInstance(Class<?> tipoUsuario){
if(tipoUsuario.getSimpleName().equals(UsuarioFisico.class.getSimpleName()))
return new UsuarioFisicoFactory();
else if(tipoUsuario.getSimpleName().equals(UsuarioJuridico.class.getSimpleName()))
return new UsuarioJuridicoFactory();
else
return null;
}
}
public class UsuarioFisicoFactory extends UsuarioFactory {
UsuarioFisicoFactory() {
}
@Override
public Usuario create() {
return new UsuarioFisico();
}
}
public class UsuarioJuridicoFactory extends UsuarioFactory {
UsuarioJuridicoFactory() {
}
@Override
public Usuario create() {
return new UsuarioJuridico();
}
}
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:
UsuarioFactory objUsuarioFactory;
Usuario objUsuario;
String tipoPessoa = input.getString("tipo_pessoa");
//Usuario Físico
if(tipoPessoa.equals("1")){
objUsuarioFactory = UsuarioFactory.getInstance(UsuarioFisico.class);
objUsuario = (UsuarioFisico)objUsuarioFactory.create();
} else {
objUsuarioFactory = UsuarioFactory.getInstance(UsuarioJuridico.class);
objUsuario = (UsuarioJuridico)objUsuarioFactory.create();
}
objUsuario.setSenha(Cryptographer.getMD5(objUsuario.getSenha()));
É 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!