Scala 类 之 单例模式

21 阅读1分钟

apply 方法:

在 Scala 中,apply 方法放在类的伴生对象(object)里,主要起到 工厂方法的作用,能够让使用者在创建该类实例时省去显式的 new 关键字,并且可以通过重载提供多种构造方式。

单例模式的实现
          在伴生对象中,创建一个对象,在apply方法中返回它
 */

  class Person() {
    println("主构造被调用.....")
  }
  object Person {
    val p = new Person()
    def apply():Person = {
      println("apply.....")
      p
    }
  }
def main(args: Array[String]): Unit = {
  val p1 = Person()  //自动调节apply方法
  val p2 = Person()

  println(p1)
  println(p2)
  println(p1 == p2)
}

Logger:日志实现

1. Option[Logger] 表示一种特殊的数据类型:可能是None,可能是Logger

2. instance.isEmpty 判断是否为空。

 /*
 实现一个日志类:Logger
 1.把一些操作信息写入到文本文件中,
 2.实现单例模式
  */
 class Logger(filename:String) {
   def log(content:String):Unit={ // 把内容写入到一个文件中
     val writer = new FileWriter(filename,true)// filename文件名 FileWriter  导入使用 java.io.FileWriter
     writer.write(content + "\n") // 写入换行
     writer.close() //关掉文件
     println(s"${content}")
   }
 }
 object Logger {
   var instance:Option[Logger] = None // 可选的,这个instance 可能是None ,也可能是Logger
   def apply(filename:String):Logger={
     if(instance.isEmpty){                    //判断这个单例对象是否生成
       instance = Some(new Logger(filename))
     }
     instance.get // 获取到具体对象。如果为None,也不会报错
   }
 }

 def main(args:Array[String]):Unit = {
   val logger1= Logger("test.log")
//   val logger2= Logger("test.log")
//   println(logger2 == logger1)
   logger1.log("2005-11-4 09:06:03 上Scala课" )
   logger1.log("2005-11-5 09:06:03 运动会" )
   logger1.log("2005-11-6 09:06:03 休息" )
 }