`
ysen
  • 浏览: 122154 次
  • 性别: 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
分享到:
评论

相关推荐

    2023vue面试题及答案(最新整理)

    4. Vue中的$nextTick有什么作用? Vue中的$nextTick是一个函数,它可以将回调函数放入callbacks等待执行,然后将执行函数放到微任务或者宏任务中。事件循环到了微任务或者宏任务,执行函数依次执行callbacks中的回...

    设计模式practice学习代码

    DOM4J是一个Java XML处理库,它与设计模式的结合可能涉及到解析XML文档时如何应用模式,比如使用模板方法模式处理XML数据,或者用策略模式来实现不同的解析策略。 4. **classroomPractice**: 这可能是课堂练习的...

    hibernate-3.2.6完整jar包+src

    4. `dom4j-1.6.1.jar`:DOM4J是一个流行的XML处理库,Hibernate用它来读写XML配置文件。 5. `javassist.jar`:另一种用于字节码操作的库,Hibernate也可以使用它来生成代理类。 6. `commons-collections.jar`:...

    Java开发与技术挑战——关于技术的技术思考.docx

    - 随后,开发者会接触到诸如dom4j、jdom、log4j、Hibernate、Spring、iBatis、Struts等开源框架。 - 数据交换中,JSON和XML的封装和解析是必备技能,正则表达式也在开发中扮演重要角色。 - 开发环境如Tomcat、...

    hibernate-release-4.1.0.Final全部jar包

    `dom4j.jar`处理XML文档,`slf4j-api.jar`和`slf4j-log4j12.jar`是日志记录接口及其实现,`antlr-2.7.7.jar`用于解析HQL和JPQL。还有其他如`javassist.jar`等辅助库,它们共同构建了Hibernate的完整生态。 6. **...

    Java学习的30个目标.txt

    - **设计模式**:熟悉GoF设计模式(Gang of Four),了解J2EE设计模式,掌握常见的设计模式如单例模式、工厂模式、策略模式等,并理解它们在实际项目中的应用场景。 - **UML图**:学会绘制并阅读类图(Class Diagram)...

    Hibernate所需的一些jar包

    8. **dom4j.jar**:Hibernate3中使用的XML处理库。 9. **javassist.jar**:动态类生成库,Hibernate用其来实现懒加载和动态代理。 **总结** 这个压缩包可能是为了搭建一个基于Hibernate3的Java J2EE项目环境而...

    hibernate工程常用jar包

    5. **dom4j.jar**:用于XML处理,Hibernate使用它解析和生成配置文件。 6. **javassist.jar**:动态字节码生成库,Hibernate使用它在运行时生成实体类的代理。 7. **jboss-jdbc驱动.jar**:特定数据库的JDBC驱动,如...

    velocity Java开发指南中文版

    - **参考资源**: 在使用Velocity时,开发者需要了解其依赖的库,例如Apache Commons Logging,用于日志记录,以及可能的模板解析库,如JDOM或DOM4J,用于处理XML结构的模板。 - **它是如何工作的?**: Velocity...

    14持久层Struts面试相关内容1

    - 在项目中,通常会使用如Log4j、Logback等日志框架来记录系统运行信息,方便调试和问题排查。 9. XML和JSON解析: - Java提供了多种库用于XML和JSON的解析,如DOM、SAX、StAX用于XML解析,而Jackson、Gson、...

    JAVA网络爬虫(蜘蛛)源码_zhizhu.rar

    7. **日志和异常处理**:良好的日志记录和异常处理机制能帮助开发者追踪和解决运行时的问题,例如使用log4j进行日志记录。 8. **设计模式**:在编写爬虫代码时,可以运用工厂模式、单例模式等设计模式,提高代码的...

    学习JAVA的30个目标.doc

    11. **XML处理**:学习XML解析API,如JAXP、JDOM、DOM4J和JAXR,理解XML在Java中的应用。 12. **Web服务**:构建和消费Web服务,使用JAX-RPC、SAAJ、JAXB、JAXM和JWSDP等API。 13. **轻量级框架**:了解Spring、...

    httpClient 调用远程接口 获取数据到本地文件夹

    为了便于问题排查和系统监控,应集成日志框架,如Log4j或SLF4J,记录请求的细节和可能出现的错误信息。此外,可以使用Prometheus或ELK Stack等工具进行性能和错误监控。 9. **代码结构与设计模式**: 保持良好的...

    Java网络爬虫(蜘蛛)源码.zip

    - 使用`java.util.logging`或log4j记录爬虫运行过程中的信息,方便调试和监控。 10. **代码结构与设计模式**: - MVC模式:将爬虫分为模型(数据处理)、视图(结果展示)和控制器(业务逻辑)三部分。 - 单例...

    javaee

    4. **Hadoop权威指南**:Hadoop是大数据处理的开源框架,这本书可能提供了Hadoop的架构分析、数据存储和处理策略,以及如何在企业环境中部署和优化Hadoop集群。 这些知识点覆盖了Java EE领域的广泛内容,从基本编程...

    spring3表述了spring的应用

    Spring使用DOM4J库解析XML配置文件。以下代码片段展示了基本的解析逻辑,包括创建`SAXReader`读取XML,遍历XML文档节点,根据节点类型创建和初始化对象: ```java public class ClassPathXmlApplicationContext ...

    Java爬虫小例子,爬取小网站,突破防盗链下载图片

    - **日志记录**:通过`java.util.logging`或Log4j记录爬取过程,便于调试和监控。 5. **异常处理**: - **网络异常**:处理网络请求时可能出现的IOException,如连接超时、网络中断等。 - **解析异常**:Jsoup在...

    Java机试相关题目34题

    本题目要求设计四个线程,其中两个线程用于增加一个全局变量j的值,另外两个用于减少j的值。需要注意线程安全问题,确保操作的原子性和同步。 13. 大数据量分页处理:在处理大数据量时,为了提高效率,通常会采用...

    java软件工程师面试基本题.pdf

    20. **日志框架**:如Log4j,它是Java中广泛使用的一个日志记录库。 21. **XML处理**:DOM、SAX解析器的使用,XML文档的创建和解析是Java企业级应用中的基本技能。 22. **设计模式**:在软件工程中,设计模式是对...

Global site tag (gtag.js) - Google Analytics