3
respostas

Melhor método para provisão de classes (Factory Pattern + Singleton Pattern)

Olá Pessoal,

Estou enfrentando alguns problemas para implementar uma série de interfaces para padronizar os métodos de diversas bibliotecas. Basicamente o que preciso é padronizar a assinatura das funções para manter a compatibilidade, ou seja, suponhamos que temos uma biblioteca A do Produto A e biblioteca B para um Produto B, a aplicação gerada utilizando a biblioteca A ou B deve ser compatível para haver reaproveitamento de código. Este é o cenário inicial, para isso, existem alguns requisitos:

  • Ter uma factory que garante a geração dos diversos módulos de forma única (singleton)

  • Provisionar uma interface que permita que a geração de novas bibliotecas sigam as regras impostas no primeiro item.

Não consegui estabelecer essa junção de padrões usando somente interfaces e abstracts. O que vocês indicam para essa tarefa?

3 respostas

Olá, Juliano.

Uma sugestão é usar a Service Loader API, disponível a partir do Java 6.

Descrevo como ela funciona nesse post: http://blog.caelum.com.br/plugins-em-java-com-service-providers/

Olá Alexandre,

Service providers é indicado também em casos onde se conhece as classes que devem ser implementadas? Por que em meu problema eu preciso criar uma interface que força a criação de um Factory único, e este factory será responsável por retornar instâncias únicas dos meus módulos, algo do tipo:

public interface IFact{

    IFact getFactInstance(Context ctx);

    IModuleA getModAInstance();
                .
                .
                .

    IModuleN getModNInstance();

}

No caso será provisionado somente essas interfaces para quem for desenvolver uma nova lib ou for usar uma lib existente, isso faz sentido? Tem forma melhor de fazer isso?

Service Providers servem para quando você quer obter as classes que implementam determinada interface do Class Path, sem embutir as implementações no seu JAR.

Se você controla as implementações e estas ficarão na mesma base de código e serão disponibilizadas no mesmo JAR em runtime, um Abstract Factory parece bem adequado!