Je sais que vous avez accepté une réponse mais je voulais donner mon propre avis. La première chose est que je ne pense pas que vous vouliez utiliser le design pattern Abstract Factory, il semble que vous ne créez pas les objets mais que vous voulez simplement localiser des objets clients en fonction de leur nom. C'est le travail du Locator, appelons-le ClientLocator (faute de mieux).
L'idée est de créer une classe appelée ClientLocator
qui implémente ApplicationContextAware
. En implémentant cette interface, Spring injectera un objet ApplicationContext
via une méthode setter. En utilisant l'objet ApplicationContext
, nous pouvons rechercher un bean par son nom, puis nous pouvons vérifier le type du bean pour nous assurer que nous obtenons le bon, et déclencher une erreur lorsque ce n'est pas le cas.
Voici à quoi ressemble le code.
Clients
// SentimentClient.java
public interface SentimentClient {
void call();
}
// FirstClient.java
@Service
public class FirstClient implements SentimentClient {
@Override
public void call() {
System.out.println("Bonjour du premier client");
}
}
// SecondClient.java
@Service
public class SecondClient implements SentimentClient {
@Override
public void call() {
System.out.println("Bonjour du deuxième client");
}
}
ClientLocator.java
@Component
public class ClientLocator implements ApplicationContextAware {
private ApplicationContext ctx;
public SentimentClient get(String name) {
return ctx.getBean(name + "Client", SentimentClient.class);
}
@Override
public void setApplicationContext(ApplicationContext ctx) throws BeansException {
this.ctx = ctx;
}
}
Voici comment nous pouvons utiliser le localisateur.
ClientLocatorDemo.java
@Component
public class ClientLocatorDemo implements CommandLineRunner {
@Autowired
private ClientLocator clientLocator;
@Override
public void run(String... args) {
SentimentClient firstClient = clientLocator.get("first");
SentimentClient secondClient = clientLocator.get("second");
firstClient.call();
secondClient.call();
// sortie:
// Bonjour du premier client
// Bonjour du deuxième client
}
}
De cette manière, à chaque fois qu'un code souhaite obtenir un client par son nom, il suffit d'autocâbler le ClientLocator
et d'appeler la méthode get(String name)
.
Et le plus important est que vous pouvez créer autant d'implémentations client que vous le souhaitez et les obtenir par leur nom (en supposant que chacun a un nom unique et se termine par 'Client') sans avoir à les autocâbler un par un.