一、基本概念



单例模式:在程序运行过程中我们需要某一对象A以唯一存在,比如服务运行容器,这个时候我们就需要单例模式。



该模式核心是,不允许其他对象新建一个A对象,只能通过A的静态公有(static public)函数获取该唯一对象。





二、java中的实现



在java中,我们有三种方式实现单例模式


1.常规做法, 使用final关键字,直接初始化 
 
 
 
package cn.hashell.pattern.singleton; 
 
public class SingletonOne { 
 
 
public static final SingletonOne instance = new SingletonOne();
 
  
 
private SingletonOne(){
};
 
  
 
public static SingletonOne getInstance(){

}
 
 
}
 
 

   2.java虚拟机特有的static加载机制,ClassLoader加载该类时初始化 
 
 
 
package cn.hashell.pattern.singleton; 
 

 
 
public class SingletonTwo {
 
 

 
 
private static final SingletonTwo instance;
 
  

static {

}
 
  

private SingletonTwo(){
}
 
  

public static SingletonTwo getInstance(){

}
 
 
}
 
 

   3.多线程加锁延迟加载,双重检测 
 
 
 
package cn.hashell.pattern.singleton; 
 

 
  
 
public class SingletonThree {
 
  
 
private static SingletonThree instance;
 
  
 
private SingletonThree(){
}
 
  
 
public static SingletonThree getInstance(){

  if(instance == null){
  
    instance = new SingletonThree();
  
  }


}
 
 
}




三、总结



单例模式的设计重点在于构造函数是不能暴露给类外使用(也就是声明为private),这样其他地方要使用这个类的实例只能通过getIntance这个函数来获取,这样我们就可以在getInstance函数中书写我们的单例逻辑。





此外,由于java编码规范final关键字的存在,我们可以用到第一种方法。而由于java虚拟机对类加载的方式能够让我们使用第二种方式。第三种方式则是多线程下同步和双重检测的应用。