19单例模式案例-日志类

50 阅读1分钟

(一)apply的基本使用

不使用new关键字创建对象?

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

package level02

/**
 * apply
 * 作用:写在伴生对象中,可以允许创建对象的时候,省略new
 */
object Class10 {

  // 伴生类
  class Logger() {}

  // 伴生对象
  object Logger {
    val instance = new Logger()
    def apply(): Logger = {
      println("logger......")
      instance
    }
  }

  def main(args: Array[String]): Unit = {
    // 创建一个类的对象
    // val log1 = new Logger()
    // 在伴生对象中提供了apply方法,那么这里就会自动去调用它 单例模式!
    val log1 = Logger()
    val log2 = Logger()
    println(log1 == log2) // 这里会输出什么 true ,因为它得到都是同一个对象
  }
}

image.png

说明

(1)apply 写在伴生对象中,它返回类的实例

(2)实例化对象时,就可以不用写new

(四)案例-改进日志

package level02

import java.io.FileWriter

/**
 * apply:写在伴生对象中,就可以允许创建对象的时候,省略new
 * 作用:写在伴生对象中,就可以允许创建对象的时候,省略new
 */
object Class11 {
  // 伴生类
  class Logger() {
    def log(content: String): Unit = {
      val writer = new FileWriter("test.log", true)
      writer.write(content)
      writer.close()
      // println(s"$content")
    }
  }
  // 伴生对象
  object Logger {
    val instance = new Logger()
    def apply(): Logger = {
      println("Logger......")
      instance
    }
  }

  def main(args: Array[String]): Unit = {
    // 创建一个类的对象
    // val log1 = new Logger()
    // 在伴生对象中提供了apply方法,那么这里就会自动去调用它
    val log1 = Logger()
    log1.log("2025-11-06 9:37:10 上课 \n")
    log1.log("2025-11-06 9:40:10 下课 \n")
  }
}