Notice: 本文作者只是设计模式、Guice和依赖注入的初学者,所以本文不会指出使用Guice的实现方法有什么好处,所写的代码未必是最佳实践,欢迎提出改进意见。
Factory Method 模式 http://www.riabook.cn/doc/designpattern/FactoryMethod.htm
如果保持这个模式,需要创建一个表现依赖关系的模块类如下:
import com.google.inject.AbstractModule;
public class EditorModule extends AbstractModule {
@Override
protected void configure() {
bind(IDocument.class).to(RTFDocument.class);
}
}
然后修改RTFEditor类的构造函数,使其createDocument方法最终可以返回一个依赖注入的值。
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
public class RTFEditor extends AbstractEditor {
IDocument docu;
@Inject
RTFEditor(IDocument idoc){
this.docu = idoc;
}
public IDocument createDocument() {
return docu;
}
public static void main(String[] args){
Injector injector = Guice.createInjector(new EditorModule());
RTFEditor editor = injector.getInstance(RTFEditor.class);
editor.newDocument();
editor.saveDocument();
editor.closeDocument();
}
}
显然这样做是很丑陋的做法,一种使代码更简洁的重构方法需要对原来的代码进行改造,我不确定改造后还算不算Factory Method 模式,因为就不再需要通过继承子类来确定依赖关系了。
具体做法是,去掉RTFEditor类,并把AbstractEditor类改为可实例化的类,所有的业务逻辑通过AbstractEditor和Guice共同实现:
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
public class AbstractEditor {
private IDocument document;
@Inject
public void newDocument(IDocument docu){
document = docu;
document.open();
}
public void saveDocument() {
if(document != null)
document.save();
}
public void closeDocument() {
if(document != null)
document.close();
}
public static void main(String[] args){
Injector injector = Guice.createInjector(new EditorModule());
AbstractEditor editor = injector.getInstance(AbstractEditor.class);
editor.saveDocument();
editor.closeDocument();
}
}
运行时可以发现,Guice在创建editor实例的时候,自动运行了Inject注解的newDocument方法。