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

dom4j中的单例策略

阅读更多

单例模式的实现方法有很多,饿汉和饱汉 ,Double-check Locking的模式,  Registry of Singleton 模式

这里介绍下单例策略

在dom4j中就生成DocumentFactory工厂单例的时候就有单例策略的使用。

 

 

 

策略的介面如下:

public interface SingletonStrategy {
    /**
     * return a singleton instance of the class specified in setSingletonClass
     */
    Object instance();

    /**
     * reset the instance to a new instance for the implemented strategy
     */
    void reset();

    
    void setSingletonClassName(String singletonClassName);
}

 

策略的两个实作:

1、

public class SimpleSingleton implements SingletonStrategy {

//singletonClassName 需要被实例化成单例的类名,在DocumentFactory 中通过配置文件传值
    private String singletonClassName = null;
//singletonInstance 通过 reset() 返回单例的实例对象
    private Object singletonInstance = null;

    public SimpleSingleton() {
    }
//只是返回实例的对象方法
    public Object instance() {
        return singletonInstance;
    }
//used by setSingletonClassName() 产生不同的单例实例对象
    public void reset() {
        if (singletonClassName != null) {
            Class clazz = null;
            try {
                clazz = Thread.currentThread().getContextClassLoader().loadClass(
                        singletonClassName);
                singletonInstance = clazz.newInstance();
            } catch (Exception ignore) {
                try {
                    clazz = Class.forName(singletonClassName);
                    singletonInstance = clazz.newInstance();
                } catch (Exception ignore2) {
                }
            }

        }
    }
//传进去singletonClassName 生成 一个实例 ,通过instance()取得单例
    public void setSingletonClassName(String singletonClassName) {
        this.singletonClassName = singletonClassName;
        reset();
    }

}

 

 

 

2、每个线程一个单例实例对象,没这么用过不知道一般用在什么地方

public class PerThreadSingleton implements SingletonStrategy {
    private String singletonClassName = null;

    private ThreadLocal perThreadCache = new ThreadLocal();

    public PerThreadSingleton() {
    }
//重置每个线程的单例对象
    public void reset() {
        perThreadCache = new ThreadLocal();
    }
//
    public Object instance() {
        Object singletonInstancePerThread = null;
        // use weak reference to prevent cyclic reference during GC
        WeakReference ref = (WeakReference) perThreadCache.get();
        // singletonInstancePerThread=perThreadCache.get();
        // if (singletonInstancePerThread==null) {
        if (ref == null || ref.get() == null) {
            Class clazz = null;
            try {
                clazz = Thread.currentThread().getContextClassLoader().loadClass(
                        singletonClassName);
                singletonInstancePerThread = clazz.newInstance();
            } catch (Exception ignore) {
                try {
                    clazz = Class.forName(singletonClassName);
                    singletonInstancePerThread = clazz.newInstance();
                } catch (Exception ignore2) {
                }
            }
            perThreadCache.set(new WeakReference(singletonInstancePerThread));
        } else {
            singletonInstancePerThread = ref.get();
        }
        return singletonInstancePerThread;
    }

    public void setSingletonClassName(String singletonClassName) {
        this.singletonClassName = singletonClassName;
    }

}

 

3、需要实现的单例类

 

public class DocumentFactory implements Serializable {
//关联一个单例策略对象
    private static SingletonStrategy singleton = null;

    protected transient QNameCache cache;

    /** Default namespace prefix -> URI mappings for XPath expressions to use */
    private Map xpathNamespaceURIs;
// used by getInstance()  创建单例策略对象 并将DocumentFactory 的classname set 给它 ,返回单例策略对象
    private static SingletonStrategy createSingleton() {
        SingletonStrategy result = null;
        //通过配置文件得到DocumentFactory 的classname
        String documentFactoryClassName;
        try {
            documentFactoryClassName = System.getProperty("org.dom4j.factory",
                    "org.dom4j.DocumentFactory");
        } catch (Exception e) {
            documentFactoryClassName = "org.dom4j.DocumentFactory";
        }

        try {
            String singletonClass = System.getProperty(
                    "org.dom4j.DocumentFactory.singleton.strategy",
                    "org.dom4j.util.SimpleSingleton");
            Class clazz = Class.forName(singletonClass);
            result = (SingletonStrategy) clazz.newInstance();
        } catch (Exception e) {
            result = new SimpleSingleton();
        }

        result.setSingletonClassName(documentFactoryClassName);
        
        return result;
    }

    public DocumentFactory() {
        init();
    }

    /**
     * <p>
     * Access to singleton implementation of DocumentFactory which is used if no
     * DocumentFactory is specified when building using the standard builders.
     * </p>
     * 
     * @return the default singleon instance
     */
//DocumentFactory 创建自己的方法 线程安全的 
    public static synchronized DocumentFactory getInstance() {
        if (singleton == null) {
            singleton = createSingleton();
        }
        return (DocumentFactory) singleton.instance();
    }

 

 

0
0
分享到:
评论

相关推荐

    dom4j-2.1.1-API文档-中文版.zip

    赠送jar包:dom4j-2.1.1.jar; 赠送原API文档:dom4j-2.1.1-javadoc.jar; 赠送源代码:dom4j-2.1.1-sources.jar; 赠送Maven依赖信息文件:dom4j-2.1.1.pom; 包含翻译后的API文档:dom4j-2.1.1-javadoc-API文档-...

    dom4j-2.1.1-API文档-中英对照版.zip

    赠送jar包:dom4j-2.1.1.jar; 赠送原API文档:dom4j-2.1.1-javadoc.jar; 赠送源代码:dom4j-2.1.1-sources.jar; 赠送Maven依赖信息文件:dom4j-2.1.1.pom; 包含翻译后的API文档:dom4j-2.1.1-javadoc-API文档-...

    DOM4J jar包 xml解析 所有的dom4j-1.6.1 dom4j-2.0.2 dom4j-2.1.1包 导入直接使用

    DOM4J jar包 所有的包 xml解析 dom4j-1.6.1 dom4j-2.0.2 dom4j-2.1.1 导入直接使用

    dom4j dom4j dom4j dom4j

    dom4j dom4j dom4j dom4j dom4j dom4j

    JavaEE源代码 dom4j-1.6.1

    JavaEE源代码 dom4j-1.6.1JavaEE源代码 dom4j-1.6.1JavaEE源代码 dom4j-1.6.1JavaEE源代码 dom4j-1.6.1JavaEE源代码 dom4j-1.6.1JavaEE源代码 dom4j-1.6.1JavaEE源代码 dom4j-1.6.1JavaEE源代码 dom4j-1.6.1JavaEE源...

    dom4j-1.6.1 与 dom4j-2.0.0-ALPHA

    dom4j-1.6.1.zip与 dom4j-2.0.0-ALPHA-2.jar

    dom4j_dom4j1.6.1安装包_

    maven dom4j 1.6.1安装包

    dom4j-1.6.1.jar (dom4j) 欢迎下载

    dom4j-1.6.1.jar,Dom4j是一个Java的XML API接口,是jdom的进化版,dom4j基本用来读写xml文件,是一个十分优秀的JavaXML API接口

    Dom4j 1.6.1 JAVA API

    dom4j帮助文档 官方API All Classes Packages org.dom4j org.dom4j.bean org.dom4j.datatype org.dom4j.dom org.dom4j.dtd org.dom4j.io org.dom4j.jaxb org.dom4j.rule org.dom4j.rule.pattern org.dom...

    资源jar包dom4j-1.6.1.rar

    dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的。dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom技术,同时它也是一个开放源代码的...

    DOM4J帮助文档及使用教程

    这个压缩包是一个关于DOM4J的压缩包,里面包含了DOM4J的帮助文档,DOM4J的使用教程,以及DOM4J这个JAVA包。保证这个压缩包是网上面最全的有关DOM4J的文档。

    dom4j.rar=dom4j API+dom4j.jar

    dom4j.rar 包括dom4j API帮助文档和dom4j.jar包.dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的。dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点

    DOM4j属性的详细介绍及相关的例子

    org.dom4j.Node : Node为所有的dom4j中XML节点定义了多态行为 org.dom4j.NodeFilter:NodeFilter定义了在dom4j节点中产生的一个滤镜或谓词的行为 org.dom4j.ProcessingInstruction : ProcessingInstruction定义XML...

    dom4j api 参考手册

    org.dom4j.bean An implementation of the dom4j API which allows JavaBeans to be used to store and retrieve attribute values from Element. org.dom4j.datatype An implementation of the dom4j API which ...

    Dom4j解析XML文档.doc

    Dom4j解析XML文档.doc Dom4j解析XML文档.doc Dom4j解析XML文档.doc Dom4j解析XML文档.doc

    dom4j1.6.1 api chm

    dom4j官方api文档,自己改为chm格式,方便大家开发学习.分享我们需要的东西!

    dom4j-1.6.1.jar及其2.0.2、2.1.1三个版本的jar包

    内含下载自dom4j官网的 dom4j-1.6.1.jar dom4j-1.6.1.tar.gz dom4j-1.6.1.zip dom4j-2.0.2.jar dom4j-2.1.1.jar

    Dom4j-1.6.1 API文档.chm

    dom4j 1.6.1 API,dom4j是一个优秀的xml解析工具包

    Dom4j常用jar包

    Dom4j常用jar包Dom4j常用jar包Dom4j常用jar包Dom4j常用jar包Dom4j常用jar包Dom4j常用jar包

    dom4j 源码

    dom4j 源码 dom4j 源码 dom4j 源码 dom4j 源码 dom4j 源码 dom4j 源码

Global site tag (gtag.js) - Google Analytics