單例介紹:
保證整個軟件系統中,某個類只能存在一個對象實例
應用場景例如:一家店的店主只能有一個;一個車的駕駛員也只能有一個;等
類別:
餓漢式:
類加載時就完成了初始化,所以類加載比較慢,但獲取對象的速度快。
不使用時就加載到內存,占用了資源
// 測試類 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 } }