应用Guice依赖注入实现工厂模式[4]——Factory Method 模式
使用Guice依赖注入实现工厂模式[4]——Factory Method 模式
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方法。