Ich mag auf zwei Arten von Fabriken denken - Fabriken, die nur Objekte aus Komponenten zusammenzubauen, und Fabriken, die in dieser Versammlung bedingte Logik zu tun.
Ihre Fabriken haben Logik hinter sich. Guice kann diese Logik nicht automatisieren, weil sie einfach die Verdrahtung von Abhängigkeiten handhabt. Wenn Sie einen Typ erstellt haben, der einige injizierte Abhängigkeiten benötigt, und einige Dinge, die nur zum Zeitpunkt der Erstellung bereitgestellt werden, dann kann die automatische Verdrahtung von Fabriken mit der AssistedInject extension von Guice erfolgen. Dadurch können Sie eine Factory-Schnittstelle angeben, alle Felder im erstellten Typ mit @AssistedInject annotieren, und die Erweiterung von guice würde eine Factory-Implementierungsklasse erstellen, die alles injizieren würde, das an den Injector gebunden ist, und diese create() -Parameter weitergibt. Aber in diesem Fall ziehen Guice und AssistedInject alle Teile zusammen - die Dinge werden nach einem vorher festgelegten Rezept verkabelt. Es trifft nicht in letzter Minute Entscheidungen über sie.
Sie stellen die bedingte Erstellung von Objekten bereit. Das wird nicht funktionieren.
An idea above erwähnt eine Fabrik für die Erstellung von Karten Typ Moderator hängt - so etwas wie:
Map<Class<? extends Message>, Class<? extends MessagePresenter>>
Dies ist ein guter Ansatz, wenn man es mit den Multibindern MapBindings kombinieren. (Ich muss diese Dokumente aufpeppen ... hmm)
Mit diesem Ansatz können Sie eine erweiterbare Factory erstellen - Definieren der anfänglichen Zuordnungen von Message -> MessagePresenter-Unterklassen, aber die Möglichkeit offen für weitere Zuordnungen später, ohne zu ändern Ihr Werk - binden nur mehr Zuordnungen auf dem Multibinder, etwa so:
MapBinder<String, Snack> mapbinder = MapBinder.newMapBinder(
binder(),
new TypeLiteral<Class<? extends Message>>(){},
new TypeLiteral<Class<? extends MessagePresenter>>(){});
mapbinder.addBinding(MyMessage.class).toInstance(MyMessagePresenter.class);
mapbinder.addBinding(YourMessage.class).toInstance(YourMessagePresenter.class);
Und Sie können in so viele Module dies tun, wie Sie möchten, mehr Typen, zwischen denen das Hinzufügen der Zuordnung zu wechseln, verwenden.
Fragen Sie, ob Guice die Logik herausfinden kann, die erforderlich ist, um eine Nachricht in einen Nachrichtenmoderator zu verwandeln? Dann nein. –
Ich frage, ob ich ein Guice-Modul konfigurieren kann, das Letter-> LetterPresenter etc 'und Guice wird die Fabrik für mich erstellen. – oshai