Estou novamente postando esta dúvida pelo fato de nao conseguir chegar a uma
solução correta sobre o assunto. Gostaria de contar com a ajuda e paciencia de todos
Estou montando um sistema em java no qual trabalharei com muitas classes,
mas em especial, eu queria uma ajuda particular nessa parte de Pessoa (Física ou Jurídica) e Fornecedor:
Situações do meu sistema:
Cliente e Fornecedor podem ser Pessoa (Física ou Jurídica).
Fornecedor tem campos específicos mesmo sendo uma Pessoa (Física ou Jurídica).
Montei o seguinte diagrama abaixo no qual implemento a interface nas classes que irei trabalhar. De forma a proporcionar a “Herança Múltipla”.
Estou tendo maiores dificuldades para instanciar minha classe cliente e acessar os getters e setters.
Perguntas:
1 - Estou montando meu diagrama da maneira correta?
2 - Como incluir meu Cliente e meu Fornecedor de forma a deixar meu sistema corretamente flexível?
3 - Alguem possui um exemplo que envolva este problema?
Fiz um exemplo bem simplório com base no que estou aprendendo sobre Design Patterns, porém este está baseado no Factory Method.
public class PessoaFactoryExemplo {
public static void main(String args[]) {
//parâmetro passado como argumento no console
//pega a instância do tipo de pessoa
Pessoa pessoa = PessoaFactory.getPessoa("F");
//mostra a pessoa
if (pessoa != null) {
System.out.println("Pessoa: " + pessoa.getTipoPessoa());
}
}
}
//Classe pai
public class Pessoa {
protected String tipoPessoa;
public String getTipoPessoa() {
return tipoPessoa;
}
}
//Classes filhas
public class PessoaFisica extends Pessoa {
public PessoaFisica() {
tipoPessoa = "Hello, sou pessoa fisica!";
}
}
public class PessoaJuridica extends Pessoa {
public PessoaJuridica() {
tipoPessoa = "Hello, sou pessoa Juridica!";
}
}
//decide qual classe será instanciada, dependendo do
//parâmetro do tipo passado
public class PessoaFactory {
public static Pessoa getPessoa(String tipoPessoa) {
if (tipoPessoa == null ) return null;
else if (tipoPessoa.equals("J")) return new PessoaJuridica();
else if (tipoPessoa.equals("F")) return new PessoaFisica();
else return null;
}
}
Pô cara realmente eu estava exatamente chegando à conclusão que vc me propôs, inclusive fazendo já com o Abstract Factory como segue abaixo. Seguindo o formato do padrão Abstract Factory esse foi o diagrama mais adequado que pude idealizar. Porém minha real intenção era centralizar a manutenção das classes produtos visto que (Cliente e Fornecedor) possuem campos idênticos como (id, razaoSocial, fantasia).
Por isso te confesso que estou a quebrar a cabeça para tal tarefa. O Livro do Gof tem me ajudado bastante apesar de ser uma questão extremamente complexa essa do Física e Juridica.