当前位置: 首页 > 知识库问答 >
问题:

使用Guice的GoF标准工厂模式

田成仁
2023-03-14

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

public class SimpleFactory {
    public static SimpleObjectInterface getSimpleObject(int data) {
         SimpleObjectInterface toReturn;
          switch(data) {
           case 1:
            toReturn = new OneSimpleObject();
           break;
          case 2:
            toReturn = new TwoSimpleObject();
          break;
          default:
             toReturn = new DefaultSimpleObject();    
          break;  
        }
        return toReturn;
      }
}

现在我在我的项目中使用Guice进行依赖注入。我的问题是我如何使用Guice实现类似上面的东西?需要哪个实现实例是在运行时根据某些用户输入来决定的。

我查看了Provider和@named注释。但我不明白它到底对我有什么帮助。

共有1个答案

卢知
2023-03-14

一般情况下,如果您想要一个注入大多数依赖项的工厂,但仍然允许一些客户端提供的DEP,您将通过辅助注入使用工厂。

然而,在您的情况下,这将导致工厂中的条件逻辑,这可能不是理想的(Guice模块明确不鼓励这样做)。

我认为对于您的情况来说,MapBinder是最理想的,您根本不需要工厂,因为您只是在切换数据类型,而不是真正构建任何东西。在模块中,您配置了int(在您的示例中)键到SimpleObjectInterface的impls的映射。然后在主运行时类中注入映射,当您需要一个简单对象的实例并且有intdata可用时,您可以在注入的映射上调用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);
  }
}

应用程序代码中:

@Inject
private Map<Integer, SimpleObjectInterface> simpleObjectMap;

...

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

这里唯一的问题是,您不能具有switch语句中的“默认”绑定。不确定处理该问题的最佳方法,如果尝试从map Binder实例化对象后该对象仍然为空,也许您可以在应用程序代码中分配一个默认的impl。或者,您可以返回到使用条件逻辑的辅助注入,但如果唯一的依赖关系是由客户端提供的,那么它就不是真正的“辅助”注入。

另请参见:Guice是否可以根据一个参数自动创建不同类的实例?

 类似资料:
  • 我在使用Guice注入的Factory时遇到问题。 我读过这篇好文章http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/assistedinject/FactoryModuleBuilder.html但我还是不明白。也就是说,为什么模块从未使用过?比如在Guice。createInjector()方法。 我尝

  • 考虑一个场景,我想用一些数据获取,并将其解析为特定类型的对象,例如。免责声明:虽然很长,但这是一个sscce;我的实际项目与猫的声音关系不大:) 要求: 第一个字符表示“动物的类型”。所以 可能指抽象, 可能指。 第二个字符可选地表示“动物的亚型”...除了这些子类型被分组到类别中(就类而言)。所以CS可能是ThaiCat扩展Cat与参数“”,可能是扩展Cat与参数,可能是扩展与参数 中包含其他信

  • 本文向大家介绍PHP工厂模式的日常使用,包括了PHP工厂模式的日常使用的使用技巧和注意事项,需要的朋友参考一下 负责生成其他对象的类或方法,这就是工厂模式,下面是一个经常见到的用法 以上所述是小编给大家介绍的PHP工厂模式的日常使用详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对呐喊教程网站的支持!

  • 我一直在用guice做一个项目。 我有一个抽象类,它有很多实现。为了使用正确的实现,我使用一个工厂,它接收参数,然后返回正确的实例。 演示代码 我想知道的是,如果我可以用替换工厂,直接注入的实现(请注意,它们应该使用辅助注入)? 谢谢你。

  • 我正在尝试使用Guice 3.0,它不会实例化工厂。 SSCCE代码: < code>BarImpl与< code>FooImpl非常相似。这里出了什么问题?还要注意,我在这里尝试了< code>@AssistedInject和< code>@Inject,两者都会导致错误。 输出: 请注意,第 9 行是对 的第一次调用的行

  • 我正在努力学习创造性设计模式,我想我现在理解了工厂方法模式。但在转向抽象工厂模式时,我找不到它的用途。我知道我错过了一些东西,但不知道在哪里。 在抽象工厂模式中,我们将有一个抽象工厂,混凝土工厂将返回实例。假设我们正在处理汽车的创建。我们将有一个像这样的抽象工厂 我们的混凝土工厂将是 在用户类中,我们将像 我认为我们也可以使用工厂模式构建相同的功能 在用户类中,我们可以 如果我的理解是正确的(如果