使用Guice依赖注入实现工厂模式[1]——Simple Factory 模式

Notice: 本文作者只是设计模式、Guice和依赖注入的初学者,所以本文不会指出使用Guice的实现方法有什么好处,所写的代码未必是最佳实践,欢迎提出改进意见。

关于Guice所有的资料都可以在其项目主页[http://code.google.com/p/google-guice/ ]中找到,其中还包括一个精彩的演讲,由于演讲中是使用Guice取代工厂模式使用的,所以作者以一些工厂模式作为练习,实现了使用Guice的重构。

 

Guice 的使用方法在这里不详细介绍了,只要在其网站上下载guice-2.0.zip,解压后将guice-2.0.jar和aopalliance.jar加入到工程类路径中即可运行以下示例。

本文中使用的设计模式的示例来自 http://www.riabook.cn/doc/designpattern/ ,每一篇都不在重复原文中的设计模式例子,请读者务必首先运行一下原文中的例子,再看这里的文章。

Simple Factory 模式 http://www.riabook.cn/doc/designpattern/SimpleFactory.htm

使用Guice实现的时候,就不在需要其中的MusicBoxFactory类了,取而代之表现依赖关系的是MusicBoxModule类,表示需要一个IMusicBox时将创建一个PianoBox对象,并注入

import com.google.inject.AbstractModule;

public class MusicBoxModule extends AbstractModule  {

	@Override
	protected void configure() {
		bind(IMusicBox.class).to(PianoBox.class);
	}
}

 

如果需要另一种依赖关系的时候,可以修改这个类,或者再创建一个模块MusicBoxPraticeModule

import com.google.inject.AbstractModule;

public class MusicBoxPraticeModule extends AbstractModule  {

	@Override
	protected void configure() {
		bind(IMusicBox.class).to(ViolinBox.class);
	}
}
 

此时对MusicBoxDemo也需要进行少量修改就可以运行示例了

import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;

public class MusicBoxDemo {
	IMusicBox musicBox;
	
	@Inject
	public MusicBoxDemo(IMusicBox musicBox){
		this.musicBox = musicBox;
	}
	
    public static void main(String[] args) throws Exception {
    	Injector injector = Guice.createInjector(new MusicBoxModule());
    	injector.getInstance(MusicBoxDemo.class).playMusicBox();
    	
    	injector = Guice.createInjector(new MusicBoxPraticeModule());
    	injector.getInstance(MusicBoxDemo.class).playMusicBox();
    }
    
    public void playMusicBox() {
        musicBox.play();
    }
}
 

该类是在构造函数中加入了Inject注解,并在对象构造期间完成了依赖注入。可以看到最终的main输出和原示例是一样的

 

你可能感兴趣的:(设计模式,Google)