是什么——什么是單例模式
單例模式(Singleton Pattern),是一種創(chuàng)建型設(shè)計模式扎拣,它規(guī)定了一個類有且只有一個實例存在依痊。
這種模式涉及到一個單一的類,該類負(fù)責(zé)創(chuàng)建自己的對象齐苛,同時確保只有單個對象被創(chuàng)建翘盖。這個類提供了一種訪問其唯一的對象的方式,可以直接訪問凹蜂,不需要實例化該類的對象馍驯。
為什么——為什么要用單例模式
節(jié)約系統(tǒng)資源,避免頻繁創(chuàng)建對象玛痊。
怎么做——怎么實現(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;
}