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 的实例.

  • 如何在相应单例工厂中限制一个类的实例的创建? 伴生对象!

Copyright © 尚硅谷大数据 2019 all right reserved,powered by Gitbook
该文件最后修订时间: 2019-07-02 08:12:45

results matching ""

    No results matching ""