单例模式是我们开发中常用的一种设计模式,今天结合JBPM来学习这个模式。本来打算先分析JBPM中的单例模式,然后总结单例模式;但是JBPM的实现并不是完全符合GOF中队单例模式的完成定义,其实现跟自己的业务有一定的关联。那么我们就先来学习严格意义上的单例模式,然后再分析JBPM实现的单例模式。
单例模式定义
保证一个类仅有一个实例,并提供一个访问它的全局访问点让类自己负责实例的生成,并
提供访问该实例的方法
在我们实际的开发中,很多时候我们需要控制某个类的实例化,并且需要控制其只能实例化一个实例;其中一个最好的方法就是让这个类负责自己的实例化,并且保证不会有其他的实例被创建,同时向外提供一个访问唯一实例的方法。这样单例模式控制了何时和怎么访问自己的实例对象。
典型代码实例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace WFTHSingletonCA
{
public class WFTHSingleton
{
private static WFTHSingleton singleton = null;
private static object lockObj = new object();
private WFTHSingleton()
{
}
public static WFTHSingleton GetWFTHSingleton()
{
if (singleton==null)
{
lock(lockObj)
{
if(singleton==null)
{
singleton = new WFTHSingleton();
}
}
}
return singleton;
}
}
}
单例类需要满足的条件
1. 需要持有保存该类实例对象的私有静态字段;
2. 拥有一个可以获取互斥锁的私有静态对象实例;
3. 将构造函数私有化,保证不能再外部进行实例化;
4. 向外部暴露获取唯一实例的接口;这里为了防止多线程重复构建该对象的实例,需要lock前后两次检查实例是否为null。
Jbpm中单例模式设计的理解分析
实例代码
package org.jbpm.api;
import java.io.File;
import java.io.InputStream;
import java.net.URL;
import org.xml.sax.InputSource;
public class Configuration {
/** singletone instance */
private static ProcessEngine singleton;
/** get the singleton ProcessEngine that is created from the default
* configuration file 'jbpm.cfg.xml'. */
public static ProcessEngine getProcessEngine() {
if (singleton == null) {
synchronized (Configuration.class) {
if (singleton == null) {
singleton = new Configuration().setResource("jbpm.cfg.xml").buildProcessEngine();
}
}
}
return Configuration.singleton;
}
}
1. 该单例模式不是针对configration对象实例的构建,而是控制流程引擎ProcessEngine的实例化时机。
2. 设定互斥锁的是configuration类,这样与获取私有静态字段对象的互斥锁的效果是一样的。
3. ProcessEngineImpl的构造函数并没有私有化,感觉这样不是很好。
4. jbpm实现的单例模式的最大特点就是将单例类负责实例的构建迁移到了configuration类中,之所以这样设计
我觉得是因为processengineimpl的构建是依赖configuration对象的(后者负责读取配置文件,加载对流程引擎的所有设置);
如果只是一味的拘泥单例模式的概念,非要ProcessEngineImpl负责自己的实例化,那也是可以的,但是我们不能控制configuration的实例化。Jbpm的实现通过获取configuration类的互斥锁,保证了只要通过调用getProcessEngine方法来实现流程引擎的初始化,就能同时保证configuration和ProcessEngineImpl都只有一个实例;但是我觉得唯一的一点缺憾可能就是没有将两者的构造函数私有化了。
总结
Jbpm对单例模式的实现并没有拘泥于模式定义的限制,灵活的根据自己的业务需要,既保证了单例模式的目的,也实现了自己的业务需求。
分享到:
相关推荐
8. "基于J2EE架构的信息系统设计模式研究及应用":设计模式是解决常见软件设计问题的模板,论文可能分析了J2EE架构下的一些经典设计模式,如工厂模式、单例模式等,并展示了在实际项目中的应用。 9. "电子商务环境...
* 掌握常用的 JAVA 设计模式(工厂模式、单例模式、动态代理模式) * 具有良好的阅读中/英文 API 帮助文档能力 * 熟练使用 MyEclipse、Eclipse 等开发工具进行 JavaEE 相关开发 工作经验 * 东莞市金田纸业有限公司...
13. **设计模式**:熟悉常见的Java设计模式,如工厂模式、单例模式、观察者模式等,并能灵活应用在项目中。理解JEE设计模式和应用程序框架设计。 14. **编程思想与素质**:具备良好的编程习惯,理解代码可读性和可...
- 具备良好的面向对象编程思想,熟悉常用的 Java 设计模式(如单例、装饰、策略、模板、工厂、观察者等设计模式)。 2. Java Web 技能: - 熟练掌握 Java Web 技术,包括 JSP、Servlet、Filter、Listener、Cookie...
* 熟悉常用的 Java 设计模式(如单例、装饰、策略、模板、工厂、观察者等设计模式) javaweb 技能 * 熟练掌握 Java Web 技术,包括 JSP、Servlet、Filter、Listener、Cookie、Session、EL 表达式、JSTL 等技术 * ...
- 熟练运用面向对象编程思想,熟悉多种设计模式,如单例、装饰、策略、模板、工厂和观察者模式。 2. **JavaWeb技术**: - 熟练使用JSP、Servlet、Filter、Listener、Cookie、Session、EL表达式和JSTL。 - 精通...
在Java编程方面,景鑫掌握了初级至高级的Java知识,包括反射、泛型和代理技术,具备深厚的面向对象编程基础,熟悉多种设计模式,如单例、装饰、策略、模板、工厂和观察者模式等。 在JavaWeb技术上,景鑫精通JSP、...
在Java技术方面,景鑫熟练掌握了初级和高级的Java知识,包括反射、泛型和代理等技术,并且熟悉面向对象编程思想和多种设计模式,如单例、装饰、策略、模板、工厂和观察者模式。在Java Web领域,他熟练运用JSP、...
1. **Java技能**:精通Java初级到高级知识,如反射、泛型和代理,拥有面向对象编程思想,熟悉常用设计模式(单例、装饰、策略、模板、工厂、观察者等)。 2. **JavaWeb技能**:熟练运用JSP、Servlet、Filter、...
他还拥有丰富的系统设计和分析能力,擅长面向对象分析和设计,熟悉设计模式,如工厂模式、单例模式等。此外,他在Web开发上有超过3年经验,包括大型和中型软件项目的设计、管理和开发,具备系统优化和数据库优化的...
- 他熟悉面向对象编程思想,能够运用常见的设计模式,如单例、装饰、策略、模板、工厂和观察者模式。 2. **Java Web技术**: - 熟练掌握JSP、Servlet、Filter、Listener、Cookie、Session、EL表达式和JSTL,表明...
他具备扎实的面向对象编程思想,并且熟悉多种Java设计模式,如单例、装饰、策略、模板、工厂和观察者模式。这表明他在编写代码时注重可维护性和可扩展性。 在Java Web领域,张三熟练运用JSP、Servlet、Filter、...
- **创建型模式**:如抽象工厂、建造者、工厂方法、原型、单例。 - **结构性模式**:如适配器、桥接、组合、装饰、外观、代理、享元。 - **行为模式**:如责任链、命令、解释器、迭代、中介者、备忘录、观察者、...
- **设计模式**:如Singleton(单例)、Factory(工厂)、Facade(门面)等,是解决常见软件设计问题的模板。 3. **JavaEE技术**: - **Struts**:MVC(模型-视图-控制器)框架,用于Web应用程序的开发。 - **...
- 单例模式确保一个类只有一个实例,并提供一个全局访问点。 ##### 解析xml文件的几种技术 - **DOM**:文档对象模型,将整个文档加载到内存中。 - **SAX**:简单API,逐行读取文档。 - **StAX**:流式API,用于大型...