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的话可以考虑使用静态内部类。

######

posted @ 2016-06-17 22:51  robin·张  阅读(2205)  评论(0编辑  收藏  举报