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<MazeDirector> {
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完成的。