Java 使用Guice的GoF标准工厂模式

Java 使用Guice的GoF标准工厂模式,java,guice,factory-pattern,Java,Guice,Factory Pattern,我以前使用过标准factory模式方法,使用factory类创建类的实例(实现特定接口),factory类有一个“create”方法,该方法根据传递给它的参数返回正确的实例(下面给出的示例片段): 现在我在我的项目中使用Guice进行依赖注入。我的问题是如何使用Guice实现上述功能?需要哪个实现实例是在运行时根据一些用户输入决定的 我已经研究了提供者和@Named注释。但我不明白它到底能帮我什么 一般来说,对于希望工厂注入大多数依赖项,但仍然允许一些客户机提供的DEP的问题,可以使用 然而,在

我以前使用过标准factory模式方法,使用factory类创建类的实例(实现特定接口),factory类有一个“create”方法,该方法根据传递给它的参数返回正确的实例(下面给出的示例片段):

现在我在我的项目中使用Guice进行依赖注入。我的问题是如何使用Guice实现上述功能?需要哪个实现实例是在运行时根据一些用户输入决定的


我已经研究了提供者和@Named注释。但我不明白它到底能帮我什么

一般来说,对于希望工厂注入大多数依赖项,但仍然允许一些客户机提供的DEP的问题,可以使用

然而,在您的情况下,这将导致工厂中的条件逻辑,这可能并不理想(它在Guice模块中显式存在)

我认为对于您的情况,a将是理想的,并且您根本不需要工厂,因为您只需要切换数据类型,而不真正构建任何东西。在您的模块中,您可以配置
int
(在您的示例中)键映射到
SimpleObjectInterface
的impls。然后在主运行时类中注入映射,当需要简单对象的实例并且int
data
可用时,在注入的映射上调用
get(data)

我在这台机器上没有IDE,所以我无法测试代码,但从内存来看,它将是如下所示:

在您的模块中:

public class MyModule extends AbstractModule {
  protected void configure() {
    MapBinder<Integer, SimpleObjectInterface> mapbinder
        = MapBinder.newMapBinder(binder(), Integer.class, SimpleObjectInterface.class);
    mapbinder.addBinding(1).toClass(OneSimpleObject.class);
    mapbinder.addBinding(2).toClass(TwoSimpleObject.class);
  }
}
公共类MyModule扩展了AbstractModule{
受保护的void configure(){
MapBinder MapBinder
=MapBinder.newMapBinder(binder(),Integer.class,SimpleObjectInterface.class);
addBinding(1.toClass)(一个SimpleObject.class);
addBinding(2.toClass)(TwoSimpleObject.class);
}
}
在您的应用程序代码中:

@Inject
private Map<Integer, SimpleObjectInterface> simpleObjectMap;

...

void applicationCode() {
  ...
  Integer data = getData();
  SimpleObjectInterface simpleObject = simpleObjectMap.get(data);
  ...
}
@Inject
私有映射simpleObjectMap;
...
无效应用程序代码(){
...
整数数据=getData();
SimpleObjectInterface simpleObject=simpleObjectMap.get(数据);
...
}
这里唯一的问题是您不能拥有switch语句中的“默认”绑定。不确定处理该问题的最佳方法,如果在尝试从map binder实例化对象后,该对象仍然为空,那么您可以在应用程序代码中指定一个默认impl。或者,您可以使用条件逻辑返回辅助注入,但如果唯一依赖项是客户机提供的,则它不是真正的“辅助”注入


另请参见:

我不确定您到底想做什么,但如果需要实例的代码告诉工厂(或注入器)它想要什么实现,这不是有点违背依赖项注入的想法吗?在我的例子中,我正在编写某些操作处理程序类。我允许执行某些特定的操作,但我需要根据所执行的用户操作获取正确操作处理程序的实例。在将我的答案发布到下面之后,我进行了一些搜索,找到了同样的问题,答案要好得多。相关帖子:很好。谢谢你的回答。
@Inject
private Map<Integer, SimpleObjectInterface> simpleObjectMap;

...

void applicationCode() {
  ...
  Integer data = getData();
  SimpleObjectInterface simpleObject = simpleObjectMap.get(data);
  ...
}