`
qiuguo0205
  • 浏览: 242463 次
  • 性别: 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超轻量级依赖注入

    2. **注解驱动**:Guice使用Java的注解来标记接口和实现,如`@Inject`用于标记构造函数、字段或方法,表示需要依赖注入。`@Singleton`表示该对象为单例,`@Named`用于指定特定的依赖实现。 3. **模块(Modules)**...

    Java依赖注入框架Guice2

    Java依赖注入框架Guice2是Google开发的一款轻量级的依赖注入库,它极大地简化了Java应用程序中的对象创建和管理。Guice2以其简洁的API和强大的功能在开发者社区中赢得了广泛的认可。依赖注入(Dependency Injection...

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

    Java Guice 3.0是一款轻量级的依赖注入(Dependency Injection, DI)框架,它致力于简化Java应用程序的构建过程,让组件之间的依赖关系更加清晰和易于管理。依赖注入是一种设计模式,它允许代码在运行时自动管理和...

    安卓Android源码——用Roboguice实现依赖注入-.rar

    总的来说,`安卓Android源码——用Roboguice实现依赖注入`这个主题涵盖了Android开发中的一种高级技术,即依赖注入,以及如何通过Roboguice框架来实现这一技术。通过深入学习和实践,开发者能够提升代码质量和开发...

    安卓Andriod源码——用Roboguice实现依赖注入-.zip

    在"安卓Andriod源码——用Roboguice实现依赖注入-.zip"这个压缩包中,包含的`RoboguiceTest`可能是一个示例项目,用于演示如何在实际的Android应用中集成和使用Roboguice。通过查看和学习这个示例,你将能更深入地...

    安卓Android源码——用Roboguice实现依赖注入-.zip

    Roboguice是基于Google的Guice框架改造的,它利用了Java的注解(Annotation)特性,提供了简单易用的API来实现依赖注入。在Android应用中,我们通常会在Activity、Service、BroadcastReceiver等组件中使用Roboguice...

    Java on Guice - Developer Day Slides.pdf

    #### 使用工厂模式实现依赖注入 **工厂模式**是一种常用的创建型设计模式,它提供了一个创建对象的接口,但允许子类决定实例化哪一个类。这种方式可以隐藏对象的创建细节,提高系统的灵活性。 示例代码展示了如何...

    google Guice 1.0 用户指南 中文

    例如,在上面的例子中,我们可以使用 Guice 来注入 Service 对象到 Client 对象中,而不需要使用工厂模式或其他方式来获取 Service 对象。这可以使得 Client 对象更加灵活和可维护。 Guice 的优越性体现在以下几个...

    Guice用户手册中文版

    - **简单工厂模式**:虽然能够实现一定程度的解耦,但在实际应用中存在以下局限性: - **单元测试复杂**:需要手动设置模拟对象,并在测试结束后清理。 - **API限制**:如单例模式的强制使用,限制了应用模式的...

    mybatis-guice-3.6.zip

    Guice通过注解来实现依赖注入,允许开发者声明他们所需的依赖,而无需手动创建对象或使用复杂的工厂模式。这样可以提高代码的可测试性、可维护性和灵活性。 MyBatis-Guice 的核心功能包括: 1. **自动配置**:通过...

    用Roboguice实现依赖注入

    在Android应用开发中,依赖注入(Dependency Injection,简称DI)是一种设计模式,它可以帮助我们创建松耦合、可测试和可维护的代码。Roboguice是一款轻量级的依赖注入框架,专为Android应用程序设计,它基于Google...

    基于guice的简单项目

    总结来说,这个基于Guice的HelloWorld项目旨在演示如何使用Guice框架进行依赖注入,以实现代码的松耦合。Guice提供了一种优雅的方式来管理对象及其依赖,使得代码更易于理解和测试。通过学习和实践这个项目,开发者...

    struts2 整合guice

    将Struts2与Guice整合可以充分利用Guice的依赖注入特性,提高Struts2应用的可测试性和模块化。 整合Struts2和Guice,首先需要在项目中引入Guice的依赖库。这通常通过在pom.xml(如果你使用的是Maven)或者build....

    Guice发音为juice,是Google为Java 11及以上版本提供的轻量级依赖注入框架.zip

    依赖注入是一种设计模式,它帮助开发者解耦代码,使得组件之间通过接口进行通信,而不是直接引用彼此,从而提高代码的可测试性、可维护性和可扩展性。 Guice的核心概念主要包括模块(Modules)、绑定(Bindings)、...

    Java on Guice

    2. **工厂模式的局限性**:工厂模式虽然可以在一定程度上缓解依赖问题,但仍然存在获取工厂本身的依赖问题,且引入了大量的样板代码。 3. **服务定位器模式的局限性**:服务定位器模式虽然有所改善,但在验证服务...

Global site tag (gtag.js) - Google Analytics