`
qiuguo0205
  • 浏览: 240863 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

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

Abstract Factory 模式 http://www.riabook.cn/doc/designpattern/AbstractFactory.htm

使用Guice实现的时候,可以将其中的MacWidgetFactory和WindowsWidgetFactory合并为一个WidgetFactory类:

 

public class WidgetFactory implements IWidgetFactory {
	
	IButton button;
	ITextField textField;
	
	@Inject
	public WidgetFactory(IButton button, ITextField textField){
		this.button = button;
		this.textField = textField;
	}
	
    public IButton getButton() {
        return button;
    }
    
    public ITextField getTextField() {
        return textField;
    }
}

 

然后需要表现依赖关系的模块类,如对Windows有WindowsWidgetModule,表示需要Windows接口时将创建一个Windows的对象,并注入

import com.google.inject.AbstractModule;

public class WindowsWidgetModule extends AbstractModule  {

	@Override
	protected void configure() {
		bind(IButton.class).to(WindowsButton.class);
		bind(ITextField.class).to(WindowsTextField.class);
		bind(IWidgetFactory.class).to(WidgetFactory.class);
	}
}
 

此时只需要在CustomDialog 的setWidgetFactory方法中加上@Inject注解即可使用了。

 

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

public class CustomDialog {
    private IButton button;
    private ITextField textField;
    
    // 由于客户端只依赖于抽象的工厂,工厂如何实作并无关客户端的事
    // 要抽换工厂并不需要改动客户端的程式
    @Inject
    public void setWidgetFactory(IWidgetFactory widgetFactory) {
        setButton(widgetFactory.getButton());
        setTextField(widgetFactory.getTextField());
    }

    public void layoutAllComponents() {
        // layout all components
    }
    
    // 这边也是依赖抽象,实际改变了元件实例
    // 客户端代码也不用更改
    public void setButton(IButton button) {
        this.button = button;    
    }
    
    public void setTextField(ITextField textField) {
        this.textField = textField;
    }
    
    public void showDialog() {
        this.paintDialog();
        button.paintButton();
        textField.paintTextField();
    }
  
    public void paintDialog() {
        System.out.println("custom dialog paints....");
    }
    
    public static void main(String[] args){
    	//CustomDialog dia = new CustomDialog(new MacWidgetFactory());
    	CustomDialog dia = new CustomDialog();
    	dia.setWidgetFactory(new WindowsWidgetFactory());
    	dia.showDialog();
    	
    	System.out.println("use guice");
    	Injector injector = Guice.createInjector(new WindowsWidgetModule());
    	injector.getInstance(CustomDialog.class).showDialog();
    }
}
 

可以看到 Guice可以再类的方法上加入了@Inject注解,并完成注入的。

 

同理若需要对Mac做模块化,只要加入一个MacWidgetModule即可

import com.google.inject.AbstractModule;

public class MacWidgetModule extends AbstractModule  {

	@Override
	protected void configure() {
		bind(IButton.class).to(MacButton.class);
		bind(ITextField.class).to(MacTextField.class);
		bind(IWidgetFactory.class).to(WidgetFactory.class);
	}
}

 

 

分享到:
评论

相关推荐

    guice超轻量级依赖注入

    guice超轻量级依赖注入用了才知道是爽

    Java guice3.0轻量级的依赖注入框架 组件

    Java guice3.0轻量级的依赖注入框架 组件guice 是轻量级的依赖注入框架,依赖注入是类将他们的依赖声明为参数,而不是直接创建依赖的一种设计模式。

    Java依赖注入框架Guice2

    Guice2中最轻的API扩展将极大地影响开发者代码的大小和维护。Guice2的开发者很好地平衡了可维护性和敏捷性。

    依赖注入与JSR-330的参考实现——Guice.docx

    Java面试经验

    injector, python 依赖注入框架,由Guice启发.zip

    injector, python 依赖注入框架,由Guice启发 注入- python 依赖注入框架,由Guice启发 简介基于 Pattern的依赖注入在 python 中比它的他语言更有用,主要是因为它对关键字参数的支持。这就是说,一个帮助这个过程的...

    依赖注入与jsr

    依赖注入(控制反转的一种形式),它是Java开发主流中一个重要的编程范式(思维方式)。简单的说,使用DI技术可以让对象从别处获得依赖项,而不是由它自己来构造。使用DI有很多好处,它能降低代码之间的耦合度,让...

    scala-dropwizard-guice-example:说明如何在 Dropwizard 应用程序中为依赖注入设置 Guice 的示例

    这个存储库包含一个简单的例子,展示了如何在 Dropwizard 中使用 Guice 进行依赖注入。 Scala 是所选择的语言,但请注意,这里是非常“Java 的咖啡脚本”,而不是任何更复杂或更实用的语言。 这个示例的创建是由一...

    [依赖注入] 依赖注入 实战 (英文版)

    [Manning Publications] 依赖注入 实战 (英文版) [Manning Publications] Dependency Injection (E-Book) ☆ 图书概要:☆ Dependency Injection is an in-depth guide to the current best practices for using ...

    GoogleGuiceDIExamples:Google Guice依赖注入框架的各种示例

    Google Guice示例。 你学到什么? 如何实现简单的链接绑定? 当您对同一个类型有多个实现时,如何...笔记: 我在大多数地方都使用javax.inject.Inject批注指定依赖项,这样我们就可以避免在特定层导入Google Guice库。

    Google Guice与MyBatis集成,并实现发送邮件轮询

    Google Guice 这个高效的与Spring类似的依赖注入框架; MyBatis配置和使用; Google Guice与MyBatis集成,支持注解事务,简单的无法想象; Mybatis与mysql集成;实现发送邮件轮询; 源码是个web项目,里面有数据库的...

    sauce, 一个C 98依赖注入框架.zip

    sauce, 一个C 98依赖注入框架 酱 基于xml的C 98插件依赖注入。如果你不需要严格的C 98兼容性,我建议你看一下谷歌的水果,而不是。design和 NAME 都受到谷歌 Guice框架插件的启发,但谷歌和Guice都没有以任何方式...

    Guice可以匹敌Dagger的轻量级注入框架

    Guice (pronounced 'juice')是一个轻量级的依赖注入框架,需要Java 6以上支持。由Google赞助

    Ray.Di:适用于PHP的Guice样式依赖项注入框架

    概述Ray.Di软件包为依赖项注入器提供了以下功能: 构造器注入和二传手注入自动注射构造后初始化原始PHP工厂代码编译器绑定注释/属性使用注入点元数据进行上下文注入面向方面的编程(AOP) 辅助注射空对象入门创建...

    Guice4.2_jar及使用手册及示例

    Spring框架的依赖注入是家喻户晓的,但是在实际的开发中我们想使用便捷的依赖注入功能,但是又不想引入Spring框架的复杂性,该怎么办呢? Google Guice一个不错选择。本资源中GUICE的使用方法和使用示例

    Guice:Java 6及更高版本的轻量级依赖注入框架-开源

    Guice是一个轻量级的,开源的,依赖项注入框架,适用于Java 6及更高版本。 这样做是为了减轻工厂的需要并在Java代码中使用new。 在某些情况下,您仍然需要像往常一样编写工厂,但是使用Guice,您的代码将不再直接...

    httpsig-ssh-bc-1.0.4.zip

    jnario-guice.zip,jnario的guice依赖注入规范jnario测试的guice依赖注入

    guice.jar/guice.jar

    guice.jar guice.jar guice.jar guice.jar guice.jar guice.jar guice.jar

    struts2 整合guice

    把struts2和guice整合起来的一个例子。

    Guice用户中文指南

    Guice用户中文指南,Guice (读作"juice")是超轻量级的,下一代的,为Java 5及后续版本设计的依赖注入容器

    guice-bridge-jit-injector:让 Guice 与 Jersey-HK2 很好地工作

    如果在Jersey 2中使用 Guice,您几乎肯定需要将 Guice 组件注入 Jersey 组件。 与常规 Guice 不同,注入 Jersey 的任何 Guice 组件都需要在 Guice 配置中声明一个绑定。 此适配器扩展了桥接器的功能以包含 Guice JIT...

Global site tag (gtag.js) - Google Analytics