使用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方法。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值