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);
}
}
}
分享到:
相关推荐
NULL 博文链接:https://goon.iteye.com/blog/1775421
Selector
在插件使用方面,file_selector插件可以方便地实现文件选择功能,支持多选和所有类型的文件,并且在选择文件后可以获取到文件的路径和其他信息。 在使用file_selector插件时,需要注意以下几点: 在Android系统中...
Laravel开发-selector 选择器模式抽象类,用于管理用户级或运行时参数上的多态性。
一个强大的selector注入器,它可以让view自动产生selector状态,免去了你写selector的麻烦。
Android selector 完整demo
selenium css selector 定位详解
一个关于SocketChannel、ServerSocketChannel、Selector的综合案例
在simulink上进行BusCreator和BusSelector的简单实验
CSS Selector 生成器
带圆角的selector
selectorgadget插件,R语言爬取网页
java selector 测试并发.多线程并发。
textarea selector > ).autosize(); // Disable: $( < textarea selector > ).autosize(false); // Handle autosize events: $( < textarea selector > ).on('autosize', callback); ##浏览器...
代码实现drawable的selector效果,不用为每个控件写selector样式; 另外,实现圆形图片处理、圆角图片处理功能
Contact Selector在infopath中的使用!
关于XML绘图(bitmap ,shape ,layer-list ,selector ,animation)的demo
ListView Button ImageView 里应用selector选择器切换图片并保持住
Android selector demo例子 文章:http://blog.csdn.net/u012524598/article/details/21410711
http://blog.csdn.net/zhufuing/article/details/20134255博客的demo下载