scala的单例模式案例-日志类

32 阅读1分钟

apply

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

基本案例

/**
 *伴生类和伴生对象,实现一种特殊的编程模式:单例模式
 *
 * 在伴生对象中补充一个apply方法,这样创建对象的时候,就可以省略
 * 伴生类名(参数) ===== 伴生对象名.apply(参数)
 */
//日志
class Logger (var filename:String) {

}
//2. 伴生对象中,访问private
object Logger {
  def apply(filename:String):Logger={
    println("apply.....")
    new Logger(filename)
  }
}

def main(args: Array[String]): Unit = {

  //省略 new
  val log1=Logger("test.log")
  println(log1.filename)
}

伴生类和伴生对象 +apply 实现 单例模式

在代码中 isEmpty判断是否为空,Some()用来包装一个对象,如果这个对象为空,就得到None对象,否则就返回这个对象。

基本案例

/**
 *伴生类和伴生对象 +apply 实现 单例模式
 *
 * 在伴生对象中补充一个apply方法,这样创建对象的时候,就可以省略 new
 * 伴生类名(参数) ===== 伴生对象名.apply(参数)
 */
//.日志类
class Logger (var filename:String) {
  def log(messager:String):Unit={
    //把日志信息写入文件中
    val writer=new FileWriter(filename,true)
    writer.write(s"$messager \n")
    writer.close()
  }
}
object Logger {
  private var instance:Option[Logger]=None
  def apply(filename:String):Logger={
    if(instance.isEmpty){
      instance=Some(new Logger(filename))
    }
    instance.get
  }
}

def main(args: Array[String]): Unit = {

  //省略 new
  val log1=Logger("test.log")

  log1.log("2025-11-03 上午上课")
  log1.log("2025-11-05 开运动会")
  log1.log("2025-11-07 周末")
}