9.1 单例对象
单例是一种非常有用的设计模式.
单例易于理解, 但是在 Java 中要实现单例还是有一些困难的.
但是毕竟幸运的是, 在 Scala 中, 单例模式已经在语言层面完成了解决.
创建一个单例要使用关键字 object
而不是 class
。
import scala.collection._
class Marker(val color: String) {
println(s"Creating ${this}")
override def toString = s"marker color $color"
}
object MarkerFactory {
private val markers = mutable.Map(
"red" -> new Marker("red"),
"blue" -> new Marker("blue"),
"yellow" -> new Marker("yellow"))
def getMarker(color: String): Marker = markers.getOrElseUpdate(color, new Marker(color))
def main(args: Array[String]): Unit = {
println(MarkerFactory getMarker "blue")
println (MarkerFactory getMarker "blue")
println (MarkerFactory getMarker "red")
println (MarkerFactory getMarker "red")
println (MarkerFactory getMarker "green")
}
}
说明:
在这个例子中,
Marker
类表示一个带有初始颜色的颜色标记器。MarkerFactory
是一个能够帮助我们复用预先创建好的Marker
实例的单例。可以直接用
MarkerFactory
这个名字访问这个单例—唯一的实例。 一旦定义了一个单例,它的名字就代表了这个单例对象的唯一实例。然而,上面的代码中还有一个问题。我们不经过
MarkerFactory
就可以直接创建一个Marker
的实例.如何在相应单例工厂中限制一个类的实例的创建? 伴生对象!