scala學習手記14 - 單例對象


java中的單例模式都很熟悉了:簡單地說就是一個類只能有一個實例。在scala中創建單例對象非常簡單,創建類時使用object關鍵字替換class即可。因為單例類無法初始化,所以不能向它的主構造函數傳遞參數。

下面是一個單例的示例:

class Marker(val color: String) {

  println("Creating " + this)

  override def toString(): String = "marker color " + color
}

object MarkerFactory {
  private val markers = Map("red" -> new Marker("red"),
                              "blue" -> new Marker("blue"),
                              "green" -> new Marker("green"))

  def getMarker(color: String) = if (markers.contains(color)) markers(color) else null
}

println(MarkerFactory getMarker "blue")
println(MarkerFactory getMarker "blue")
println(MarkerFactory getMarker "red")
println(MarkerFactory getMarker "red")
println(MarkerFactory getMarker "yellow")

其中的MarkerFactory就是一個單例。單例一旦定義完畢,它的名字就表示了這個單例的唯一實例。用單例表示單例可以作為參數傳遞給函數,就像通常傳遞實例一樣。

執行下上面的這段代碼:

image

MarkerFactory的getMarker方法()像足了java中靜態方法的調用。

還有一點要注意的就是Map對象的賦值和取值,和Python很像。

此外,最后一點,因為在這個示例程序中Marker類只會被MarkerFactory調用,所以有必要保護好Marker,使之不能被其它類調用。上面的代碼沒有做到這一點。如果是Java的話可以考慮使用靜態內部類。

######


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM