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

Selector&SelectorProvider关于工厂模式方面源分析

阅读更多

Seletor和SelectorProvider综合使用了“Simple Factory”和“Factory Method”来应对将来可能的Selector机制和SelectorProvider的变化。使用“Simple Factory”可以提供一种默认工厂,使用起来很方便;使用“Factory Method”能够最大程度的满足实现机制方面的变化。

 

下面是关于这两个类在工厂模式方面的代码片段

 

Selector代码:

 

package java.nio.channels;

import java.io.IOException;
import java.nio.channels.spi.SelectorProvider;
import java.util.Set;

public abstract class Selector { 

	/**
     * Initializes a new instance of this class.
	//迫使它的子类必须有一个缺省参数的构造方法
     */
    protected Selector() { }


    /** 产品本身所提供的服务,相当于Product.service()*/  
    public abstract int select() throws IOException;


    /**
     * Opens a selector.
     *
     * <p> The new selector is created by invoking the {@link
     * java.nio.channels.spi.SelectorProvider#openSelector openSelector} method
     * of the system-wide default {@link
     * java.nio.channels.spi.SelectorProvider} object.  </p>
     *
     * @return  A new selector
     *
     * @throws  IOException
     *          If an I/O error occurs
     */
   //静态工厂方法,相当于Product.newDefaultProduct()
    public static Selector open() throws IOException {
	return SelectorProvider.provider().openSelector();
    }


}

 

 

SelectorProvider代码:

 

public abstract class SelectorProvider {


	/**
     * Initializes a new instance of this class.  </p>
     *
     * @throws  SecurityException
     *          If a security manager has been installed and it denies
     *          {@link RuntimePermission}<tt>("selectorProvider")</tt>
     */
	//迫使它的子类必须提供一个缺省参数的构造方法
//以支持在反射时,能够确定使用class.newInstance(),不带参的。
    protected SelectorProvider() {
	SecurityManager sm = System.getSecurityManager();
	if (sm != null)
	    sm.checkPermission(new RuntimePermission("selectorProvider"));
    }


	/**
	简单工厂方法,通过此方法我们可以获取默认的Provider,关于默认的Provider,
	一般会在Sun提出标准的时候,Sun自己也给出一个默认实现。另外,指定标准的团队
	也会把设置默认Provider的接口提供出来。	
	*/
	public static SelectorProvider provider() {
	synchronized (lock) {
	    if (provider != null)
		return provider;  //保证默认Provider是一个单例
	    return (SelectorProvider)AccessController
		.doPrivileged(new PrivilegedAction() {
			public Object run() {
			    if (loadProviderFromProperty())
				return provider;  //提供一种支持用户自己设置默认Provider的方式
							//而且这里的编码风格符合Flower在Refactoring中提倡的
							//些原则。
			    if (loadProviderAsService())
				return provider;
			    provider = sun.nio.ch.DefaultSelectorProvider.create();
					//Sun的默认实现
			    return provider;
			}
		    });
	}
    }
}


private static final Object lock = new Object();//用来支持默认Provider的单例模式的
private static SelectorProvider provider = null;//用来支持默认Provider的单例模式的


private static boolean loadProviderFromProperty() {
	String cn = System.getProperty("java.nio.channels.spi.SelectorProvider");
	if (cn == null)
	    return false;
	try {
	    Class c = Class.forName(cn, true,
				    ClassLoader.getSystemClassLoader());
	    provider = (SelectorProvider)c.newInstance();
	    return true;
	} catch (ClassNotFoundException x) {
	    throw new ServiceConfigurationError(x);
	} catch (IllegalAccessException x) {
	    throw new ServiceConfigurationError(x);
	} catch (InstantiationException x) {
	    throw new ServiceConfigurationError(x);
	} catch (SecurityException x) {
	    throw new ServiceConfigurationError(x);
	}
    }

}

 

分享到:
评论

相关推荐

    Java NIO——Selector机制解析三(源码分析)

    本文将深入探讨Java NIO中的Selector机制,并通过源码分析来理解其实现原理。 Selector机制是Java NIO中的核心组件,它允许单线程同时监控多个通道(Channels)的状态变化,例如连接就绪、数据可读或可写等。这种...

    iOS 设计模式 工厂模式

    在提供的压缩包`AbstractFactoryPattern-master`中,可能包含了更多关于工厂模式的示例代码和深入解释,你可以进一步研究学习,以加深对工厂模式的理解,并将其应用到你的iOS项目中。通过熟练掌握工厂模式,你的代码...

    java selector 测试并发

    JavaSelector在Java NIO(非阻塞I/O)中扮演着关键角色,它允许程序...为了深入了解Java Selector的并发测试,需要查看`src`目录下的源代码,分析其中的`Selector`、`SelectionKey`和`SelectableChannel`的使用情况。

    ScalableIOJava(NIO如何实现Selector模式的).pdf

    NIO的Selector模式在这些方面提供了很好的支持,使得应用程序能够根据实际运行情况灵活调整质量设置。 本文档通过对NIO中的Selector模式的深入分析,揭示了其在实现高性能网络服务中的巨大作用。通过理解Reactor...

    flutter file-selector

    在插件使用方面,file_selector插件可以方便地实现文件选择功能,支持多选和所有类型的文件,并且在选择文件后可以获取到文件的路径和其他信息。 在使用file_selector插件时,需要注意以下几点: 在Android系统中...

    OC-工厂模式-处理不同通知

    工厂模式是设计模式中的一种,它在软件工程中扮演着重要的角色,特别是在处理不同类的实例化时。本篇我们将深入探讨OC中的工厂模式及其在处理不同通知时的应用。 ### 1. 工厂模式简介 工厂模式是一种创建型设计模式...

    Laravel开发-selector

    选择器模式(Selector Pattern)是一种设计模式,它允许在运行时动态地选择算法或行为,提供了一种灵活的方式来应对多态性。在 Laravel 开发中,这种模式可以被用来处理用户级别的参数或运行时的条件判断,以实现更...

    Android设置button背景selector和字体selector

    为了实现美观且交互丰富的按钮,我们可以使用Selector来定义按钮在不同状态下的背景和字体颜色。Selector是Android中的一种状态列表资源,它可以为控件在不同状态(如按下、默认、聚焦等)下显示不同的效果。 标题...

    NVIDIA Display Mode Selector Tool User Guide-v03-Mar22

    "NVIDIA显示模式选择器工具用户指南" 本文档是NVIDIA显示模式选择器工具的用户指南,旨在帮助用户正确地使用该工具来管理和配置 NVIDIA 显示模式。该工具允许用户启用或禁用物理显示端口,从而实现更好的显示效果和...

    selectorgadget插件.zip

    【标题】:使用SelectorGadget插件进行网页数据抓取 【内容】 在现代的数据分析领域,网络数据已经成为一个不可或缺的资源。R语言作为一种强大的统计分析工具,也提供了丰富的库来帮助用户从网页中提取数据。其中...

    Android selector

    通过查看该项目的源代码,开发者可以更深入地了解Selector的用法和实现细节,例如如何创建自定义的Selector,如何动态改变Selector状态等。对于初学者来说,这是一个很好的学习资源,可以帮助他们理解并熟练运用...

    Selector

    3. "Selector":这个文件名可能是另一个文件,可能是CSS文件,JavaScript文件,或者是一个包含更多关于Selector用法的文本文件。 综合这些信息,我们可以深入学习以下几个知识点: 1. **CSS选择器**:包括类选择器...

    iconFont 实现selector的Demo

    通过查看和分析源代码,我们可以学习如何将iconfont与selector结合,以及如何在实际项目中应用这一技术。 总的来说,"iconFont 实现selector的Demo"是一个实用的案例,它展示了如何利用阿里巴巴的iconfont服务来...

    SelectorGadget CSS选择器

    SelectorGadget是一款强大的浏览器插件,专为网页开发者和设计师设计,主要功能是自动化生成CSS选择器。在网页开发过程中,我们经常需要精确地定位HTML元素以便进行样式修改或JavaScript操作,而SelectorGadget则能...

    android selector注入器

    在Android开发中,选择器(Selector)是一种非常重要的机制,用于定义View在不同状态下的显示样式,如按下、聚焦、默认等。`android selector注入器` 提供了一种高效且便捷的方式来管理这些状态选择器,使得开发者...

    Android selector 完整demo

    在Android开发中,Selector是一种非常重要的资源类型,它主要用于定义视图在不同状态下的外观,如按下、聚焦、默认和选中等。本教程将深入探讨Android中的Selector及其使用方法,通过一个完整的Demo来帮助你理解和...

    Head First设计模式 Java源代码

    Java的`java.nio.channels.Selector`类在不同状态下的行为差异就是状态模式的应用。 18. **策略模式** (Strategy): 策略模式定义了一系列算法,并将每一个算法封装起来,使它们可以相互替换,让算法的变化独立于...

    Contact Selector控件的使用

    总结,Contact Selector控件在InfoPath中的使用涉及多个步骤,包括创建表单、添加控件、配置数据源、设置辅助数据源、管理数据连接、设置安全选项以及发布和验证表单。熟练掌握这些步骤,能够帮助我们在InfoPath中...

    java nio Selector的使用-客户端

    接着,我们可以使用`channel.configureBlocking(false)`将通道设置为非阻塞模式,然后调用`channel.register(selector, interestOps)`方法将通道注册到Selector上,其中`interestOps`是想要监听的事件类型,如OP_...

    ListView Button ImageView 里应用selector选择器切换图片并保持住

    这就是`selector`选择器的作用,它可以帮助我们在不同状态下切换图片,并保持住相应的状态。现在,我们将详细探讨如何在ListView、Button和ImageView中应用selector来实现这一功能。 首先,让我们了解什么是`...

Global site tag (gtag.js) - Google Analytics