應用最廣的模式之一,單例物件的類必須保證只有乙個例項存在,許多適合系統之需要擁有乙個全域性物件,這樣有利於我們協調系統整體的行為。如在乙個應用中,之需要存在乙個imaloader,這個imageloader既含有執行緒池,快取系統,網路請求,很耗費資源,因此沒有理由讓它構造多個例項。
確保乙個類只有乙個例項,並且自行例項化向整個系統提供這個例項。
ps:我覺得這兩個點很重要,只有乙個例項,怎麼實現?private 建構函式;自行例項化:直接將類作為成員變數並且靜態化。
幾個關鍵點:
(1)建構函式私有化不對外開放,private宣告
(2)通過乙個靜態方法或者列舉返回單例類物件
(3)確保單例類的物件只有乙個,尤其是在多執行緒環境下
(4)確保單例類在反序列化時候不會重新構建物件
確保某個類有且只有乙個物件的場景,避免產生多個物件消耗過多的資源,或者某個型別的物件應該有且只有乙個。比如:訪問io和資料庫,網路操作等
public
class
staff
}public
class
vpextends
staff
}public
class
ceoextends
staff()
public
static ceo getceo()
public
void
work()
}public
class
company
public
void
showallstaffs()}}
public
class
test
}
執行後發現兩個ceo物件是一樣的,因為staff1和staff2完全一致。
5.1 懶漢模式
前面是用餓漢模式實現的,它是宣告靜態變數的時候就已經初始化了。
懶漢模式是宣告靜態物件,只有在呼叫getinstance的時候進行初始化,而且在getinstance方法中新增了關鍵字synchronized,也就是getinstacne是乙個同步方法,也就是保證在多執行緒情況下單例物件的唯一性。
如下:
public
class
singleton()
public
static synchronized singeoton getinstance()
return msingleton();
}public
void
dosomething(){}
}
存在的問題就是即使msingleton已經被初始化了(第一次呼叫singleton就會被初始化),每次呼叫getinstance的時候都要進行一次同步,這樣會消耗不必要的資源。相對餓漢模式來說,優點是單例只有在使用時才會倍初始化。
5.2 dcl實現單例
public
class singleton
public
static singleton getinstance()}}
return instance;
}public
void
dosomething(){}
}
本程式進行了兩次判斷第一次判斷是為了不必要的同步,第二次判斷是為了在null情況下建立例項。這種單例是使用最多的。
優點:資源利用率高,第一次執行getinstance才會被例項化。
缺點:第一次載入反應稍微慢點,高併發環境下有一定的缺陷,雖然概率小。
感謝《android原始碼設計模式》
設計模式之一單例模式
單例模式就是類別只有乙個例項,每次在必得類呼叫這個類的例項,都是同乙個例項。通過單例模式可以保證系統中乙個類只有乙個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在乙個,單例模式是最好的解決方案。如印表機 顯示卡等等這些系統資源。如果做andr...
設計模式之一 單例模式
單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項。即乙個類只有乙個物件例項。定義乙個單例類,使用類的私有指標變數指向類的唯一例項,並且使用乙個共有的靜態方法獲取該例項。懶漢模式 即第一次呼叫該類的例項的時候才產生乙個新的該...
設計模式之一 單例模式
一.什麼是單例模式 某個類同時保留乙個物件,不希望有更多物件,此時,我們則應考慮單例模式的設計。二.單例模式的特點 1.單例模式只能有乙個例項。2.單例類必須建立自己的唯一例項。3.單例類必須向其他物件提供這一例項。三.單例模式vs靜態類 在知道了什麼是單例模式後,我想你一定會想到靜態類,既然只使用...