单例模式是应用最广的模式之一。在应用中,对于很耗资源的对象,比如线程池,缓存系统等,没有理由让它构造多个实例,只需要拥有一个全局对象。单例模式保证只有一个实例存在。
确保某个类只有一个对象的场景,避免产生多个对象消耗过多资源或一个对象需要消耗的资源过多,比如访问IO和数据库等资源
单例模式UML图:

单例模式的实现方法有多种,其中有些存在同步或者效率问题,推荐以下两种实现方法:
1.DCL:能够在需要时进行初始化,又能保证线程安全,并且单例对象初始化后调用getInstance不进行同步锁。但老版本JDK存在内存模型的问题,所以不要在JDK1.5以及之后的版本,需要加上volatile来确保对象每次都从内存中读取
public class Singleton{
private static Singleton sInstance = null;
private Singleton(){
}
public static Signleton getInstance(){
if(sInstance == null){
synchronized (Singleton.class){
if(sInstance == null){
sInstance = new Singleton();
}
}
}
return sInstance;
}
}
2.静态内部类:DCL存在某些极个别情况下会出现失效问题,因此需要采用静态内部类方法。第一次加载Singleton类时不会初始化sInstance,只有第一次调用getInstance方法才会导致虚拟机加载SingletonHolder类。
public class Singleton{
private Singleton(){
}
public static Singleton getInstance(){
return SingletonHolder.sInstance;
}
private static class SingletonHolder{
private static final Singleton sInstance = new Singleton();
}
}
3.C++11标准保证了本地静态变量只会初始化一次
public class Singleton{
public:
static Singleton& instance(){
static Singleton *instance = new Singleton();
return *instance;
}
private:
Singleton(){
}
}