Google Guice不是另一家工厂吗?

7 java design-patterns guice

我想实例化一个用户帐户.我可以使用这样的工厂:

public class UserFactory {
  public User newUser(UserType type) {
    if (type == UserType.FREE) return new FreeUser();
  }
}

User user = UserFactory.newUser(UserType.FREE);  //UserType.FREE is an enum
Run Code Online (Sandbox Code Playgroud)

现在如果我使用Google Guice,我必须写一个"模块":

public class UserModule extends AbstractModule {

  public voidSetType(UserType type) {
    this.type = type;
  }

  @Override 
  protected void configure() {
    if (this.type = UserType.FREE)
      bind(User.class).to(FreeUser.class);
    else bind .....
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,这是客户端代码:

Injector injector = Guice.createInjector(new UserModule().setType(UserType.FREE)));
Run Code Online (Sandbox Code Playgroud)

我的问题是:我必须编写一个模块类,而不是编写工厂类.从上面的例子中,我没有看到任何优势.Module类使用反射,它比工厂类中的赋值语句慢.Module类并不比工厂类简单.我必须维护模块,而不是维护工厂.

无论如何,真正的优势是什么?Google Guice不是另一个工厂类吗?

Mic*_*mlk 8

由于Guice(依赖注入)不是为了取代工厂,因此您没有看到优势.它可以做到有限的程度(参见AssistedInject和Providers)但如果你的工厂有逻辑,那么你不太可能使用Guice作为直接替代品.

Guice的方式是仍然有一个工厂,Guice将注入工厂.现在用户听起来像一个域对象,并且很可能不需要Guice注入的依赖树.如果确实如此,则工厂应该知道Guice,并Provider为每个用户类型选择s或者直接访问Inject以使用不同的Keys 创建User对象.

DI就是依赖树.工厂都是关于生成对象而没有调用者必须关心如何实现该对象.它们可以交叉使用,但它们可以解决不同的问题.