单例模式要求相应的类,只需要构造对象一次就行了。
因此需要将这个类的构造方法改为私有
所有类有构造方法,不编码则系统默认生成空的构造方法,若有显示定义的构造方法,默认的构造方法就会失败。
这样对外部代码,不能用new来实例化它,但是我们完全可以再写一个public方法,GetInstance(),这个方法的目的就是返回一个类实例。
而此方法中,去做实例化判断,若没有实例化,就是用private的构造方法new给出这个实例。
单例模式:客户端不再需要考虑是否需要去实例化的问题,而把责任都给了应该负责的类去处理。
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
一个非多线程的简单框架程序:
class Singleton
{
private static Singleton instance;
private Singleton()
{
}
public static Singletion getInstance()
{
if(instance == NULL)
{
instance = new Singleton();
}
return instance;
}
}
为了多线程安全,同时为了保证不是每个使用单例模式的对象都要进行加锁判断
需要将加锁添加到,只有实例为空的情况下。代码如下
class Singleton
{
private static Singleton instance;
private Lock lock = new ReentrantLock();
private Singleton()
{
}
public static synchronized Singletion getInstance()
{
if(instance == NULL)
{
lock.lock();
try{
if(instance == NULL)
instance = new Singleton();
}finally{
lock.unlock;
}
}
return instance;
}
}
好了,这是很重要的~
public class Dictionary {
/*
* 词典单子实例
*/
private static final Dictionary singleton;
/*
* 词典初始化
*/
static{
singleton = new Dictionary();
}
/**
* 词典初始化
* 由于IK Analyzer的词典采用Dictionary类的静态方法进行词典初始化
* 只有当Dictionary类被实际调用时,才会开始载入词典,
* 这将延长首次分词操作的时间
* 该方法提供了一个在应用加载阶段就初始化字典的手段
* 用来缩短首次分词时的时延
* @return Dictionary
*/
public static Dictionary getInstance(){
return Dictionary.singleton;
}
}
以上代码是著名分词软件IK analyzer使用单例模式的方法。