Notice: 本文作者只是设计模式、Guice和依赖注入的初学者,所以本文不会指出使用Guice的实现方法有什么好处,所写的代码未必是最佳实践,欢迎提出改进意见。
Builder 模式 http://www.riabook.cn/doc/designpattern/BuilderPattern.htm
使用Guice实现的时候,可以只用bind方法来进行依赖关系的建立,但是这样对现有代码的改造太多。因此这里将使用Guice的另一个特性——Provider来进行Builder模式的改造。使用这种方法的时候,原示例中的代码除了Main类之外都不需要改动:
由于MazeDirector实例的创建需要比较多的参数,所以我们建立一个MazeDirector的Provider,其作用看上去和工厂方法很像。
import com.google.inject.Inject; import com.google.inject.Provider; public class MazeDirectorProvider implements Provider{ IMazeBuilder mazeBuilder; @Inject public MazeDirectorProvider(IMazeBuilder mazeBuilder) { this.mazeBuilder = mazeBuilder; } public MazeDirector get() { MazeDirector director = new MazeDirector(); director.setMazeBuilder(mazeBuilder); int[][] maze = { { 1, 1, 1, 1, 1, 1, 1 }, { 1, 0, 0, 0, 0, 2, 1 }, { 1, 0, 1, 0, 1, 0, 1 }, { 1, 0, 2, 1, 0, 1, 1 }, { 1, 1, 0, 1, 0, 1, 1 }, { 1, 0, 0, 2, 0, 0, 1 }, { 1, 1, 1, 1, 1, 1, 1 } }; director.setMaze(maze); return director; } }
然后需要表现依赖关系的模块类如下:
import com.google.inject.AbstractModule; public class MazeModule extends AbstractModule { @Override protected void configure() { bind(IMazeBuilder.class).to(DiamondMazeBuilder.class); bind(MazeDirector.class).toProvider(MazeDirectorProvider.class); } }
此时Main方法的内容就很少了,只是关注获取一个MazeDirector对象,并运行其buildMaze方法。
import com.google.inject.Guice; import com.google.inject.Injector; public class Main { public static void main(String[] args) { Injector injector = Guice.createInjector(new MazeModule()); injector.getInstance(MazeDirector.class).buildMaze(); } }
观察这段代码,当要求获得一个MazeDirector类的实例的时候,Guice会查找绑定关系,,并确定通过MazeDirectorProvider类来提供,MazeDirectorProvider中需要IMazeBuilder接口的注入,依然是Guice完成的。