單列設計模式,無論在java或是在android中都是比較常用的軟件設計模式
單列概念(3個重要要點):
一個類有且緊有一個實例,且自行實例化,並向整個系統提供這個實例;
具體體現在以下三點:
1.單例模式的類只提供私有的構造函數
2.類定義中含有一個該類的靜態私有對象
3.該類提供了一個靜態的公有的函數用於創建或獲取它本身的靜態私有對象。
優點:
1.單例模式會阻止其他對象實例化其自己的單例對象的副本,從而確保所有對象都訪問唯一實例。
2.因爲類控制了實例化過程,所以類可以靈活更改實例化過程。
缺點:
開發人員必須記住自己不能使用new關鍵字實例化對象。
1.懶漢式(類加載時不需要初始化)
public class Singleton {
//懶漢式單例模式 比較懶,在類加載時,不創建實例,因此類加載速度快,但運行時獲取對象的速度慢
private static Singleton sSingleton=null;//靜態私用成員,沒有初始化
private Singleton(){
//私有構造函數
}
public static synchronized Singleton getSingleInstance(){
if(sSingleton ==null){
sSingleton = new Singleton();
}
return sSingleton;
}
}
2.餓漢式(在類加載時就完成了初始化,所以類加載較慢,但獲取對象的速度快)
public class Singleton {
//餓漢單例模式
//在類加載時就完成了初始化,所以類加載較慢,但獲取對象的速度快
private static Singleton sSingleton = new Singleton();//靜態私有成員,已初始化
private Singleton() {
//私有構造函數
}
/**
* //靜態,不用同步(類加載時已初始化,不會有多線程的問題)
* @return
*/
public static Singleton getSingleInstance() {
return sSingleton;
}
}
3.雙重校驗鎖
/**
* 雙重校驗鎖
* 這個是懶漢式的升級版,俗稱雙重檢查鎖定
*/
public class Singleton {
private volatile static Singleton sSingleton;
private Singleton() {
}
public static Singleton getSingleton() {
if (sSingleton == null) {
synchronized (Singleton.class) {
if (sSingleton == null) {
sSingleton = new Singleton();
}
}
}
return sSingleton;
}
}
關於單例模式跟全局變量的區別
全局變量是一個變量,存在於某個具體的類中,
單列是一個對象,存在整個應用;
example:android中提供網絡請求工具類的單列:
public class HttpUtils {
private volatile static HttpUtils instance;
public static HttpUtils getInstance() {
if (instance == null) {
synchronized (HttpUtils.class) {
if (instance == null) {
instance = new HttpUtils();
}
}
}
return instance;
}
}