现在很多有关java的书籍、视频、博客等有讲解java中的单例模式的实现,但是遗憾的是,很多讲的都不是完全严谨的。
java中一个严谨的单例模式应该包含以下几个方面:
1.有一个private类型静态实例,从而防止从外部直接访问;
2.构造函数必须是private的,防止外部使用构造函数进行实例化产生新的对象;
3.拥有一个静态工厂方法,而且必须是同步的,从而防止多线程环境下同时执行;该方法返回前面定义的实例对象;
4.必须重写clone方法,并返回当前实例对象(默认的clone()方法会创建新的实例对象)。
/**
* @author xiaoyang
* 单例模式
*/
public class SingletonFactory {
private volatile static SingletonFactory instance;//volatile防止java内存模型的无序写入的问题
private SingletonFactory() {
}
public static SingletonFactory getInstence(){
//双重检查加锁
if(instance==null){
synchronized(SingletonFactory.class){
if(instance==null){
instance=new SingletonFactory();
}
}
}
return instance;
}
//必须重写clone方法,返回该单例。否则调用clone方法会产生新的实例。
@Override
protected SingletonFactory clone() throws CloneNotSupportedException {
return instance;
}
}