Abstract Factory

Olá pessoal!

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:

  1. Cliente e Fornecedor podem ser Pessoa (Física ou Jurídica).
  2. 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?

Fico bastante grato a todos pela ajuda.

Como faço para postar uma figuram aqui no guj? :lol:

grato!

Ola Igor Novaes,

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;
    }
}

Espero ter contribuido.

Olá Alberto Queiroz,

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.

Abraço…Grato pela força!