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机制,并通过源码分析来理解其实现原理。 Selector机制是Java NIO中的核心组件,它允许单线程同时监控多个通道(Channels)的状态变化,例如连接就绪、数据可读或可写等。这种...
在提供的压缩包`AbstractFactoryPattern-master`中,可能包含了更多关于工厂模式的示例代码和深入解释,你可以进一步研究学习,以加深对工厂模式的理解,并将其应用到你的iOS项目中。通过熟练掌握工厂模式,你的代码...
JavaSelector在Java NIO(非阻塞I/O)中扮演着关键角色,它允许程序...为了深入了解Java Selector的并发测试,需要查看`src`目录下的源代码,分析其中的`Selector`、`SelectionKey`和`SelectableChannel`的使用情况。
NIO的Selector模式在这些方面提供了很好的支持,使得应用程序能够根据实际运行情况灵活调整质量设置。 本文档通过对NIO中的Selector模式的深入分析,揭示了其在实现高性能网络服务中的巨大作用。通过理解Reactor...
在插件使用方面,file_selector插件可以方便地实现文件选择功能,支持多选和所有类型的文件,并且在选择文件后可以获取到文件的路径和其他信息。 在使用file_selector插件时,需要注意以下几点: 在Android系统中...
工厂模式是设计模式中的一种,它在软件工程中扮演着重要的角色,特别是在处理不同类的实例化时。本篇我们将深入探讨OC中的工厂模式及其在处理不同通知时的应用。 ### 1. 工厂模式简介 工厂模式是一种创建型设计模式...
选择器模式(Selector Pattern)是一种设计模式,它允许在运行时动态地选择算法或行为,提供了一种灵活的方式来应对多态性。在 Laravel 开发中,这种模式可以被用来处理用户级别的参数或运行时的条件判断,以实现更...
为了实现美观且交互丰富的按钮,我们可以使用Selector来定义按钮在不同状态下的背景和字体颜色。Selector是Android中的一种状态列表资源,它可以为控件在不同状态(如按下、默认、聚焦等)下显示不同的效果。 标题...
"NVIDIA显示模式选择器工具用户指南" 本文档是NVIDIA显示模式选择器工具的用户指南,旨在帮助用户正确地使用该工具来管理和配置 NVIDIA 显示模式。该工具允许用户启用或禁用物理显示端口,从而实现更好的显示效果和...
【标题】:使用SelectorGadget插件进行网页数据抓取 【内容】 在现代的数据分析领域,网络数据已经成为一个不可或缺的资源。R语言作为一种强大的统计分析工具,也提供了丰富的库来帮助用户从网页中提取数据。其中...
通过查看该项目的源代码,开发者可以更深入地了解Selector的用法和实现细节,例如如何创建自定义的Selector,如何动态改变Selector状态等。对于初学者来说,这是一个很好的学习资源,可以帮助他们理解并熟练运用...
3. "Selector":这个文件名可能是另一个文件,可能是CSS文件,JavaScript文件,或者是一个包含更多关于Selector用法的文本文件。 综合这些信息,我们可以深入学习以下几个知识点: 1. **CSS选择器**:包括类选择器...
通过查看和分析源代码,我们可以学习如何将iconfont与selector结合,以及如何在实际项目中应用这一技术。 总的来说,"iconFont 实现selector的Demo"是一个实用的案例,它展示了如何利用阿里巴巴的iconfont服务来...
SelectorGadget是一款强大的浏览器插件,专为网页开发者和设计师设计,主要功能是自动化生成CSS选择器。在网页开发过程中,我们经常需要精确地定位HTML元素以便进行样式修改或JavaScript操作,而SelectorGadget则能...
在Android开发中,选择器(Selector)是一种非常重要的机制,用于定义View在不同状态下的显示样式,如按下、聚焦、默认等。`android selector注入器` 提供了一种高效且便捷的方式来管理这些状态选择器,使得开发者...
在Android开发中,Selector是一种非常重要的资源类型,它主要用于定义视图在不同状态下的外观,如按下、聚焦、默认和选中等。本教程将深入探讨Android中的Selector及其使用方法,通过一个完整的Demo来帮助你理解和...
Java的`java.nio.channels.Selector`类在不同状态下的行为差异就是状态模式的应用。 18. **策略模式** (Strategy): 策略模式定义了一系列算法,并将每一个算法封装起来,使它们可以相互替换,让算法的变化独立于...
总结,Contact Selector控件在InfoPath中的使用涉及多个步骤,包括创建表单、添加控件、配置数据源、设置辅助数据源、管理数据连接、设置安全选项以及发布和验证表单。熟练掌握这些步骤,能够帮助我们在InfoPath中...
工厂提供的处于显示关闭模式的 GPU(例如 NVIDIA A40 GPU)如果其模式之前已更改,则可能处于显示启用模式。 要更改支持多种显示模式的 GPU 的模式,请使用 displaymodeselector 工具 .\displaymodeselector.exe ...
接着,我们可以使用`channel.configureBlocking(false)`将通道设置为非阻塞模式,然后调用`channel.register(selector, interestOps)`方法将通道注册到Selector上,其中`interestOps`是想要监听的事件类型,如OP_...