實現方式:(構造器私有,提供乙個外部可以訪問的方法(可以提供例項))
1、餓漢式:執行緒安全,呼叫效率高, 不能延時載入
2、懶漢式:執行緒安全,呼叫效率不高,可以延時載入(要用的時候才載入 )
3、雙重鎖檢測式:「由於jvm底層內部模型原因,偶爾會出現問題,不建議使用」
4、靜態內部類式:執行緒安全,呼叫效率高,且可以實現延時載入
(上面的四種方式都可以通過反射和反序列化 破壞 單例模式)
5、列舉:執行緒安全,呼叫效率高,不能延時載入,可以天然的防止反射和反序列化
如果單例物件占用資源少,不需要延時載入:餓漢式:列舉式 優於 餓漢式
如果單例物件占用資源大, 需要延時載入:
靜態內部類式 優於 懶漢式
/*餓漢式: 最開始就已經把例項給建立好了 */
public
class
singleton01
public
static singleton01 getinstance()
}
懶漢式:
/*懶漢式: 用的時候才會初始化例項 效率不高就是因為有synchronized這個關鍵字 */
public
class
singleton02
public staticsynchronizedsingleton02 getinstance()
return
instance;
}}
靜態內部類:
/*靜態內部類: 只有在主動呼叫這個類的時候才會載入 外部類載入的時候 靜態內部類不會載入 */
public
class
singleton03
private
singleton03()
public
static singleton03 getinstance()
}
列舉:
/*列舉 天然的可以防止 反射和反序列化 */
public
enum
singleton04
}
通過反射破壞單例模式:
publicclass
test01
}
如何破壞反射:
publicclass
singleton01
else}}
public
singleton01 getinstance()
}
在用反射就會報錯....
通過反序列化破壞單例模式:
物件序列化:將物件狀態轉換為位元組流的過程,可以將其儲存到磁碟檔案中或者通過網路傳送到任何其他程式中。
反序列化:將位元組流轉化為物件的過程。
publicclass
test01
}
防止反序列化:
publicclass singleton01 implements
serializable
public
static
singleton01 getinstance()
//在反序列化的時候 直接呼叫這個方法 返回instance 而不是返回反序列化後的新物件
private object readresolve() throws
objectstreamexception
}
建立者模式 單例模式(Singleton)(1)
1.描述 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。2.單例模式主要有3個特點,2.1 單例類確保自己只有乙個例項。2.2 單例類必須自己建立自己的例項。2.3 單例類必須為其他物件提供唯一的例項。3.實現方式 懶漢單例類 和 餓漢單例類 另參見3.1 懶漢式單例類 對於懶漢模式,我們...
單例設計模式 序列化破壞單例模式?
1 問題猜想,假如將乙個物件通過序列化放到乙個檔案後,再取出來看是否與本身相等?public class hungrysingleton implements serializable private hungrysingleton public static hungrysingleton get...
建立者模式
當我們使用抽象工廠時,在客戶端進行呼叫的時候,如果產品的類別比較多,那麼此時工廠返回的例項物件將會很多。客戶端得 將會大大增加,這將不利於程式的可讀性。為了解決此類問題,可以把所有例項的建立放在乙個類中去生成,這樣在客戶端只需要呼叫這個建立者類,大大減少客戶端的 量。1,所有動物類的介面 packa...