單例模式保證為一個類生成唯一的實例對象;
Android中 Application 可以說是單例模式的一個類渺尘;
- 優(yōu)點:
實例時,只需調(diào)用一個單一的方法即可生成一個唯一的實例说敏,節(jié)約資源鸥跟,減少內(nèi)存開銷;
避免對資源的多重占用;- 缺點:
很難實現(xiàn)序列化医咨,導(dǎo)致很難被持久化枫匾,也難通過網(wǎng)絡(luò)傳輸;
由于單例采用靜態(tài)方法拟淮,無法在繼承結(jié)構(gòu)中使用
對照表.png
/**
* Created by curry on 2017/8/9
* 單例模式
*/
public class Singleton {
private Singleton() {
}
/**
* 餓漢式 : 適合初始化時就要用到單例的情況;適合初始化速度快(操作少),占用非常小的內(nèi)存情況
* <p>
* 多線程下不會出現(xiàn)問題干茉,因為JVM只會實例一個單例類
*/
private static Singleton mSingleton = new Singleton();
public static Singleton newInstance() {
return mSingleton;
}
/**
* 懶漢式 : 適合有耗時操作,占用內(nèi)存大,對啟動速度有要求,只在特定場景使用一般不用的情況 可以延時加載單例
* <p>
* 多線程下會出現(xiàn)問題,可能會創(chuàng)建多個單例
*/
private static Singleton mSingleton = null;
public static Singleton newInstance() {
if (mSingleton == null) {
mSingleton = new Singleton();
}
return mSingleton;
}
/**
* 方案一:
* 解決實現(xiàn) : 線程安全 和 延時加載
* <p>
* 通過實現(xiàn)內(nèi)部類很泊,這樣加載單例時就不會再重新實例
*/
private static class SingletonHolder {
private static Singleton mSingleton = new Singleton();
}
public static Singleton newInstance() {
return SingletonHolder.mSingleton;
}
/**
* 方案二:雙重校驗鎖
* 加同步鎖角虫,來解決多線程問題
*/
private static volatile Singleton mSingleton = null;
public static Singleton newInstance() {
if (mSingleton == null) {
synchronized (Singleton.class) {
if (mSingleton == null) {
mSingleton = new Singleton();
}
}
}
return mSingleton;
}
public void doSomething() {
//Do something ...
}
}