我想实例化一个用户帐户。我可以使用这样的工厂:
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
现在,如果我使用 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 .....
  }
}
然后,这是客户端代码:
Injector injector = Guice.createInjector(new UserModule().setType(UserType.FREE)));
我的问题是:我必须编写一个模块类,而不是编写一个工厂类。从上面的例子中,我没有看到任何优势。Module 类使用反射,它比我在工厂类中的赋值语句要慢。Module 类并不比工厂类简单。我必须维护模块,而不是维护工厂。
无论如何,真正的优势是什么?Google Guice 不就是另一个工厂类吗?