java中的單例模式都很熟悉了:簡單地說就是一個類只能有一個實例。在scala中創建單例對象非常簡單,創建類時使用object關鍵字替換class即可。因為單例類無法初始化,所以不能向它的主構造函數傳遞參數。 下麵是一個單例的示例: class Marker(val color: String) {... ...
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就是一個單例。單例一旦定義完畢,它的名字就表示了這個單例的唯一實例。用單例表示單例可以作為參數傳遞給函數,就像通常傳遞實例一樣。
執行下上面的這段代碼:
MarkerFactory的getMarker方法()像足了java中靜態方法的調用。
還有一點要註意的就是Map對象的賦值和取值,和Python很像。
此外,最後一點,因為在這個示常式序中Marker類只會被MarkerFactory調用,所以有必要保護好Marker,使之不能被其它類調用。上面的代碼沒有做到這一點。如果是Java的話可以考慮使用靜態內部類。
######