建立型模式
,乙個例項
,全域性訪問點
單例模式實現方式有以下幾種
反射是否會破壞singleton?
實現方式
是否會被破壞
懶漢模式
會餓漢模式
會靜態內部類
會enum
拋異常,不支援反射
// 懶漢模式
lazysingleton instance1 = lazysingleton.
getinstance()
; constructor
constructor1 = lazysingleton.
class
.getdeclaredconstructor()
; constructor1.
setaccessible
(true);
lazysingleton lazysingleton = constructor1.
newinstance()
; system.out.
println
("lazysingleton use reflection: "
+(lazysingleton == instance1));
// 靜態內部類
constructor
constructor2 = innerclasssingleton.
class
.getdeclaredconstructor()
; constructor2.
setaccessible
(true);
innerclasssingleton innerclasssingleton = constructor2.
newinstance()
; innerclasssingleton instance2 = innerclasssingleton.
getinstance()
; system.out.
println
("innerclasssingleton use reflection: "
+(innerclasssingleton == instance2));
// 餓漢模式
hungrysingleton instance3 = hungrysingleton.
getinstance()
; constructor
constructor3 = hungrysingleton.
class
.getdeclaredconstructor()
; constructor3.
setaccessible
(true);
hungrysingleton hungrysingleton = constructor3.
newinstance()
; system.out.
println
("hungrysingleton use reflection: "
+(hungrysingleton == instance3));
// enum
enumsingleton instance4 = enumsingleton.
getinstance()
; constructor
constructor4 = enumsingleton.
class
.getdeclaredconstructor
(string.
class
,int
.class);
constructor4.
setaccessible
(true);
enumsingleton enumsingleton = constructor4.
newinstance
("instance",0
);system.out.
println
("enumsingleton use reflection: "
+(enumsingleton == instance4)
);
解決方式是: 類似於enum,在構造方法中判斷單例是否存在,存在丟擲異常
if
((clazz.
getmodifiers()
& modifier.enum)!=0
)throw
newillegalargumentexception
("cannot reflectively create enum objects"
);
serialize序列化是否會破壞singleton?
enum有自己的序列化方式,所以不會破壞
其餘的需要增加any-access-modifier object readresolve() throws objectstreamexception;
方法
設計模式系列 單例模式
單例模式 確保乙個類只有乙個例項,並提供乙個全域性訪問點。什麼情況下需要單例模式?一些類提供公共功能供別人呼叫,本身不會處理業務邏輯 類會被許多類和執行緒呼叫 單例模式的一些注意點 單例的生存期超長,會導致記憶體的持續占用。單例在多執行緒環境需要小心的處理執行緒互斥,進行資源保護。單例在類的繼承樹中...
設計模式系列 單例模式
單例模式就是指單例類在一定的生命週期內只能有乙個物件例項,單例類的建立必須是本身,並能給使用者提供自身。在現實世界中,每個生命體都可以被看做是乙個單例物件,唯一且具體,具有不可複製性。同樣的,在軟體開發領域中,有時我們需要保證客戶端在當前的客戶機上只能執行乙個例項這個時候,我們就應該考慮使用單例模式...
設計模式系列 單例模式
今天單位有自己的食堂啦,發郵件收了工卡之後統一拿去啟用,以後就用工卡去食堂吃飯啦,早上2元,中午10元,晚上3元,都是自助噢,很爽,不過還是有一推人沒有第一時間啟用卡,也有的人啟用卡了忘記自己啟用了,我就是其中乙個,無奈下我只好到食堂自己去啟用卡了,餐廳只有乙個機會卡的櫃檯所以啟用的時候需要排隊,還...