- 核心原理:
- 構造函數(shù)私有化
- 通過靜態(tài)方法獲取唯一實例
- 優(yōu)點
- 在內(nèi)存中只有一個實例,減少內(nèi)存開支與系統(tǒng)性能開銷
- 避免對資源的多重占用
- 全局訪問
- 缺點
- 一般沒有接口,擴展困難,需要修改代碼
- 單例如果持有Context,容易引發(fā)內(nèi)存泄漏。如果必須持有一般是用Application
餓漢模式
public class Singleton{
private static Singleton sInstance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return sInstance;
}
}
懶漢模式
public class Singleton{
private static Singleton sInstance = null;
private Singleton(){}
public static synchronized Singleton getInstance(){
if(sInstance == null){
sInstance = new Singleton();
}
return sInstance;
}
}
雙檢測鎖定模式
jdk1.5以上有volatile關鍵字,低版本可能出現(xiàn)DCL失效
public class Singleton{
private static volatile Singleton sInstance = null;
private Singleton(){}
public static Singleton getInstance(){
if(sInstance == null){
sychnorized(Singleton.class){
if(sInstance == null){
sInstance = new Singleton();
}
}
}
return sInstance;
}
}
靜態(tài)內(nèi)部類**
推薦方式,利用類加載機制
public class Singleton{
private Singleton(){}
public static Singleton getInstance(){
return SingletonBuilder.sInstance;
}
private static class SingletonBuilder{
private static final Singleton sInstance = new Singleton();
}
}
枚舉
可避免反序列化時重新生成對象,前面幾種方法要避免此情況,可以加入readResolve。
public enum SingletonEnum{
INSTANCE;
}
容器
如利用hashmap 使用key獲取對象等。