是什么——什么是單例模式
單例模式(Singleton Pattern),是一種創(chuàng)建型設(shè)計(jì)模式,它規(guī)定了一個類有且只有一個實(shí)例存在。
這種模式涉及到一個單一的類,該類負(fù)責(zé)創(chuàng)建自己的對象,同時確保只有單個對象被創(chuàng)建。這個類提供了一種訪問其唯一的對象的方式,可以直接訪問,不需要實(shí)例化該類的對象。

單例模式類圖
為什么——為什么要用單例模式
節(jié)約系統(tǒng)資源,避免頻繁創(chuàng)建對象。
怎么做——怎么實(shí)現(xiàn)單例模式
- 1.懶漢式單例模式
懶加載,需加同步保證線程安全。同步方法導(dǎo)致不高效。
/**
* 懶漢式單例模式
*/
public class LazySingleton {
private static LazySingleton INSTANCE;
private LazySingleton(){
}
public static synchronized LazySingleton getInstance(){
if(INSTANCE == null){
INSTANCE = new LazySingleton();
}
return INSTANCE;
}
}
- 2.餓漢式單例模式
線程安全,非懶加載,某些情況下不適用。
/**
* 餓漢式單例模式
*/
public class EagerSingleton {
private static EagerSingleton INSTANCE = new EagerSingleton();
private EagerSingleton(){
}
public static EagerSingleton getInstance(){
return INSTANCE;
}
}
- 3.雙重加鎖檢查單例模式
懶加載,線程安全,JDK1.5之前存在問題,不建議使用。
/**
* 雙重加鎖檢查單例模式
*/
public class DoubleCheckedLockSingleton {
private static volatile DoubleCheckedLockSingleton INSTANCE;
private DoubleCheckedLockSingleton(){
}
public static DoubleCheckedLockSingleton getInstance(){
if(INSTANCE == null){
synchronized (DoubleCheckedLockSingleton.class){
if(INSTANCE == null){
INSTANCE = new DoubleCheckedLockSingleton();
}
}
}
return INSTANCE;
}
}
4.靜態(tài)內(nèi)部類單例模式
懶加載,線程安全。Effective Java推薦的方法。
/**
* 靜態(tài)內(nèi)部類單例模式
*/
public class StaticNestedClassSingleton {
private static class SingletonHolder{
private static final StaticNestedClassSingleton INSTANCE
= new StaticNestedClassSingleton();
}
private StaticNestedClassSingleton(){
}
public static StaticNestedClassSingleton getInstance(){
return SingletonHolder.INSTANCE;
}
}
5.枚舉單例模式
簡單,線程安全,非懶加載,能避免反序列化生成新的對象。
/**
* 枚舉單例模式
*/
public enum EnumSingleton {
INSTANCE;
}