注入工厂 - 如何以及为什么?

时间:2012-05-17 18:24:23

标签: java factory factory-pattern

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

Test.java:

Foo foo = FooFactory.get(argument);

FooFactory.java:

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

我应该怎么做呢? “重新绑定”在评论者的第一条评论中意味着什么?

2 个答案:

答案 0 :(得分:6)

通过执行您所做的操作,您基本上忽略了依赖注入,并使用了静态工厂。因此,如果在单元测试中,您希望工厂返回虚假的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实现(通常是模拟)。

答案 1 :(得分:3)

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