Ich habe folgende sehr einfache Schnittstelle:Wie man einfach eine Fabrik von mehreren Parameter-divergierenden Klassen mit Guice handhabt?
public interface IDataSource<T> {
Observable<T> observable();
}
Jetzt werde ich es mehrere Implementierungen werden müssen. Jede dieser Implementierungen kann sich auf unterschiedliche Parameter stützen (verschiedene Speicherobjekte: JDBC, Cassandra, Redis ...). Also zum Beispiel werde ich haben:
public class CassandraDataSource implements IDataSource<MyCassandraObject> {
@Inject
public CassandraDataSource(Keyspace ks) {
// ...
}
}
public class OtherCassandraDataSource implements IDataSource<MyOtherCassandraObject> {
@Inject
public OtherCassandraDataSource(Keyspace ks) {
// ...
}
}
public class JDBCDataSource implements IDataSource<MyJdbcObject> {
@Inject
public JDBCDataSource(Database db) {
// ...
}
}
Und so weiter.
Was ich möchte, ist jeder der mit einer Zeichenfolge zu verweisen, so dass ich eine Fabrik aufrufen kann, die die entsprechende IDataSource
zurückgeben würde. Etwas, das sich so verhalten würde:
public class DataSourceFactory {
public static final Map<String, Supplier<IDataSource<?>>> map = new HashMap<>();
@SuppressWarnings("unchecked")
public <T> IDataSource<T> get(String ref) {
return (IDataSource<T>) map.get(ref).get();
}
}
ich geben könnte N Providers
als Parameter (oder direkte Feld Injektion) zu meiner Fabrik und Karte Strings, die den in den Konstruktor (N die Anzahl der IDataSource
Ich benutze ist) oder Verwenden Sie einen Schalter in der get
Methode, aber das würde ziemlich ein Chaos werden, sobald ich 10 bis 20 erreichen IDataSource
(oder mehr!)
Gibt es eine einfachere Lösung, die ich übersehen habe?
Dank