[Resolvido] Como o factory method proporciona um acoplamento fraco?

2 respostas
A

Boa madruga caros!

Estou me matando para entender o designer pattern factory method, então tive uma
duvida sobre o acoplamento fraco, sei(minha opinião) que é referente sobre o uso do new( instância ) ,
mas a quantidade de new será superior com uso do factory method, então
como explicar o acoplamento fraco?

Tive essa dúvida estudando a apostila da K-19, onde tem um exemplo para distribuir mensagem via
sms, jms e e-mail.

Resumidamente, em ênfase aos new sem factory method ficará assim:

// Main

Emissor emissor1 = new EmissorEmail();Emissor emissor2 = new EmissorJMS();Emissor emissor3 = new EmissorSMS();

Total: 3 instâncias.

Agora com uso do padrão factory method:

// classe creatorEmissorEmissor emissor1 = new EmissorEmail();Emissor emissor2 = new EmissorJMS();Emissor emissor3 = new EmissorSMS();

// classe main
EmissorCreator creator = new EmissorCreator();

Totalizando: 4 quatros instâncias

Muito obrigado!

Att,
André Vieira.

2 Respostas

MarkKnopfler

Boa madrugada pra vc tb!

O problema não é tanto a quantidade de new que vc dá (ou seja, a qtd. de instâncias), mas sim à quantidade de classes diferentes a que vc se refere diretamente:

Emissor emissor1 = new EmissorEmail(); 
Emissor emissor2 = new EmissorJMS(); 
Emissor emissor3 = new EmissorSMS();

Desse jeito, você nem precisa de uma classe mãe Emissor, porque vc lida diretamente com os filhos! O acoplamento aqui é alto pq vc se refere a 4 classes (Emissor e suas filhas) em um curto trecho de código!

O ideal é que vc tente se referir apenas ao tipo mais geral ("programe voltado à interface e não à implementação"). Uma das maneiras de resolver isso é usando uma factory: de 4 classes inicialmente, vc passa a se referir só a duas: Emissor e EmissorCreator:

EmissorCreator creator = new EmissorCreator(); 
Emissor emissor1 = creator.create("sms");

Agora, se vc quer acoplamento baixo de verdade, considere usar o padrão dependency injection. Faça a sua classe receber de fora (no construtor ou por método "set") a instância já pronta do Emissor que vc necessita:

public class MinhaClasse {

   private Emissor emissor;

   public MinhaClasse(Emissor e) {  // Recebendo no construtor
      this.emissor = e;
   }


}

Isto vai criar um ligeiro "problema" que é quanto à criação do emissor, vai dar um pouco mais de trabalho vc ficar empurrando as coisas para fora. Mas a ideia é essa mesmo, ir retirando o acoplamento de cada classe. Em algum momento vc vai "concentrar" as dependências em um lugar só:

Emissor e = new EmissorSMS();
MinhaClasse m = new MinhaClasse(e);

Considere incluir no seu plano de aprendizado para futuro próximo o framework Spring, ele ajuda a resolver essa questão da injeção de dependências e te deixar com um código menos acoplado.

Paz!! :D :D

A
MarkKnopfler:
Boa madrugada pra vc tb!

O problema não é tanto a quantidade de new que vc dá (ou seja, a qtd. de instâncias), mas sim à quantidade de classes diferentes a que vc se refere diretamente:

Emissor emissor1 = new EmissorEmail(); 
Emissor emissor2 = new EmissorJMS(); 
Emissor emissor3 = new EmissorSMS();

Desse jeito, você nem precisa de uma classe mãe Emissor, porque vc lida diretamente com os filhos! O acoplamento aqui é alto pq vc se refere a 4 classes (Emissor e suas filhas) em um curto trecho de código!

O ideal é que vc tente se referir apenas ao tipo mais geral ("programe voltado à interface e não à implementação"). Uma das maneiras de resolver isso é usando uma factory: de 4 classes inicialmente, vc passa a se referir só a duas: Emissor e EmissorCreator:

EmissorCreator creator = new EmissorCreator(); 
Emissor emissor1 = creator.create("sms");

Agora, se vc quer acoplamento baixo de verdade, considere usar o padrão dependency injection. Faça a sua classe receber de fora (no construtor ou por método "set") a instância já pronta do Emissor que vc necessita:

public class MinhaClasse {

   private Emissor emissor;

   public MinhaClasse(Emissor e) {  // Recebendo no construtor
      this.emissor = e;
   }


}

Isto vai criar um ligeiro "problema" que é quanto à criação do emissor, vai dar um pouco mais de trabalho vc ficar empurrando as coisas para fora. Mas a ideia é essa mesmo, ir retirando o acoplamento de cada classe. Em algum momento vc vai "concentrar" as dependências em um lugar só:

Emissor e = new EmissorSMS();
MinhaClasse m = new MinhaClasse(e);

Considere incluir no seu plano de aprendizado para futuro próximo o framework Spring, ele ajuda a resolver essa questão da injeção de dependências e te deixar com um código menos acoplado.

Paz!! :D :D

Muito obrigado mesmo! Entendi perfeitamente.

Abraço.

Criado 12 de novembro de 2012
Ultima resposta 12 de nov. de 2012
Respostas 2
Participantes 2