单例模式是我们开发中常用的一种设计模式,今天结合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对单例模式的实现并没有拘泥于模式定义的限制,灵活的根据自己的业务需要,既保证了单例模式的目的,也实现了自己的业务需求。