一、基本概念
单例模式:在程序运行过程中我们需要某一对象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(){
return instance;
}
}
2.java虚拟机特有的static加载机制,ClassLoader加载该类时初始化
package cn.hashell.pattern.singleton;
public class SingletonTwo {
private static final SingletonTwo instance;
static {
instance = new SingletonTwo();
}
private SingletonTwo(){
}
public static SingletonTwo getInstance(){
return instance;
}
}
3.多线程加锁延迟加载,双重检测
package cn.hashell.pattern.singleton;
public class SingletonThree {
private static SingletonThree instance;
private SingletonThree(){
}
public static SingletonThree getInstance(){
synchronized (SingletonThree.class) {
if(instance == null){
synchronized (SingletonThree.class) {
instance = new SingletonThree();
}
}
}
return instance;
}
}
三、总结
单例模式的设计重点在于构造函数是不能暴露给类外使用(也就是声明为private),这样其他地方要使用这个类的实例只能通过getIntance这个函数来获取,这样我们就可以在getInstance函数中书写我们的单例逻辑。
此外,由于java编码规范final关键字的存在,我们可以用到第一种方法。而由于java虚拟机对类加载的方式能够让我们使用第二种方式。第三种方式则是多线程下同步和双重检测的应用。