Scala实现单例模式

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。

通过单例模式可以保证系统中一个类只有一个实例。

对于系统中的某些类来说,只有一个实例很重要,例如,

  • 一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;
  • 一个系统中只能有一个窗口管理器或文件系统;
  • 一个系统只有一个计时工具或ID(序号)生成器;
  • 如果在Windows中就只能打开一个任务管理器;

 

在Scala中是没有static这个东西的,但是我们可以使用Object来实现;

Scala中使用单例模式时,除了定义的类之外,还要定义一个同名的Object对象,它和类的区别是,Object对象不能带参数。

当单例对象与某个类共享同一个名称时,它被称作是这个类的伴生对象:companion object。你必须在同一个源文件里定义类和他的伴生对象。

类被称为这个单例对象的伴生类:companion class。

类和他的伴生对象可以互相访问其私有成员。

 

这里定义了一个单例对象:一个有且仅有一个实例的类。Object语句在定义了一个Marker类的同时,也定义了一个Marker的实例。

这个实例在第一次使用的时候会进行实例化。

 


object Marker{
  // 私有化方法
  private val markers: Map[String, Marker] = 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
  }

  def main(args: Array[String]): Unit = {
    println(new Marker("red"))
    /**
      * 执行流程
      * 1。首先实例化,然后调用println("创建" + this)方法去打印私有化对象markers:Map
      *  -> 创建颜色标记:red
      *     创建颜色标记:blue
      *     创建颜色标记:green
      * 2.然后打印实例化时传递进去的参数"red"
      * -> 创建颜色标记:red
      * 3.执行println(new Marker("red"))的println()方法打印出来 -> 颜色标记:red
      */
    println(Marker.getMarker("y"))
    /**
      * 执行流程
      * 我们用实例Marker调用getMarker方法
      * 判断y没有在markers:Map中,则打印println(null)
      * -> null
      */
  }
}

class Marker private(var color:String){
  println("创建" + this)
  // 重写所有方法中的toString
  override def toString:String = {
   "颜色标记:" + color
  }
}

 

发布了1958 篇原创文章 · 获赞 696 · 访问量 359万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览