【问题标题】:Inject Factories - How and why?注入工厂 - 如何以及为什么?
【发布时间】:2012-05-17 18:24:23
【问题描述】:

在代码审查中,出现了以下 cmets:“我认为,您实际上是指将工厂作为实例注入,以便您可以在需要时重新绑定工厂。”和“重要提示:工厂不应该是静态的,而应该是注入的。”

Test.java:

Foo foo = FooFactory.get(argument);

FooFactory.java:

public final class FooFactory {
    public static Foo get(String argument) {
        return new Foo();
    }
}

否则我应该怎么做?审稿人第一条评论中的“rebind”是什么意思?

【问题讨论】:

  • 或许你应该问问审稿人她的意思。
  • 您有没有请代码审查员向您详细解释一下?就个人而言,我不知道他在说什么。
  • “重新绑定”会给你带来什么?如果您的工厂不是基于接口的,我认为没有理由注入。

标签: java factory factory-pattern


【解决方案1】:

通过你所做的,你基本上忽略了依赖注入,而是使用了静态工厂。因此,如果在单元测试中,您希望您的工厂返回 Foo 的假实例而不是真实实例,则不能。

相反,您应该使用依赖注入(此处为 Spring 示例):

public class SomeService
    private FooFactory fooFactory;

    @Autowired
    public SomeService(FooFactory fooFactory) {
        this.fooFactory = fooFactory;
    }

    public void someMethod(String arg) {
        Foo foo = fooFactory.create(arg);
        ...
    }
    ....
}

现在,在单元测试中,您可以注入任何您想要的 FooFactory 实现(通常是模拟)。

【讨论】:

  • 有单元测试,所以我认为这就是审阅者的意思。非常感谢这个答案!
  • 我是 DI 新手。这里有工厂当然很棒,但是工厂将使用 new 关键字实例化一个 Foo ,这导致 foo 对象不受 DI 容器管理。这样可以吗?我想我的问题是,什么时候应该由容器管理一个类,什么时候可以只使用 new 关键字?谢谢!
【解决方案2】:

对于大多数依赖注入框架,您可以在运行时绑定特定的对象实现。我敢打赌,这也是评论者所指的。当然,要利用这一点,您必须注入您的工厂,而不是静态创建它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 2019-01-17
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    相关资源
    最近更新 更多