單例介紹:
保證整個軟件系統中,某個類只能存在一個對象實例
應用場景例如:一家店的店主只能有一個;一個車的駕駛員也只能有一個;等
類別:
餓漢式:
類加載時就完成了初始化,所以類加載比較慢,但獲取對象的速度快。
不使用時就加載到內存,占用了資源
// 測試類
object TestSingle extends App {
val boss1 = Boss.getBoss
val boss2 = Boss.getBoss
// 1355531311 1355531311
print(boss1.hashCode() + " " + boss2.hashCode()) // 哈希值相等 對象為同一個 實現了單例
}
/*
底層代碼
public SingleTon getInstance() {
if (s == null) {
s_$eq(new SingleTon());
}
return s();
}
*/
class Boss private() { // Boss類的構造方法私有化
var name: String = _
println("懶漢式~~~")
}
// 懶漢式
object Boss {
private var b: Boss = null // 先賦值為null
def getBoss = {
if (b == null) { // 判斷不為null 才實例化對象
b = new Boss // 在這里 實例化對象
}
b
}
}
懶漢式:
等到引用時才會被加載
// 測試類
object TestSingle extends App {
val b1 = Boss2.getBoss2
val b2 = Boss2.getBoss2
// 564160838 564160838 對象為同一個,形成了單例模式
print(b1.hashCode() + " " + b2.hashCode())
}
class Boss2 private() { // 構造方法私有化
var age: Int = _
println("餓漢式~~~")
}
// 餓漢式
object Boss2 {
private val b: Boss2 = new Boss2 // 直接實例化對象
def getBoss2 = {
b
}
}
