单例模式案例-日志类

69 阅读2分钟

Apply方法

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

  • apply 写在伴生对象中,它返回类的实例
  • 实例化对象时,就可以不用写new

apply实现单例模式

示例代码:

package Luwenzhen

object class05 {
   /*
      apply
      apply方法写在伴生对象中,可以在创建对象的时候,省略new关键字
      实现单例模式
      在伴生对象中,创建一个对象,在apply方法中返回它
    */
  class Person() {
     println("主构造器被调用。。。")

   }
  object  Person {
    val p=new Person()
    def apply():Person={
      p
    }

  }

  def main(args: Array[String]): Unit = {
    //创建一个类的对象
    //val p1=new Person()
    val p1=Person()//自动调用apply方法
    val p2=Person()

    println(p1)
    println(p2)
    println(p1==p2)//true
  }
}

运行结果:

主构造器被调用。。。
Luwenzhen.class05$Person@27f674d
Luwenzhen.class05$Person@27f674d
true

案例-日志类

  • Option[Logger] 表示一种特殊的数据类型:可能是None,可能是Logger
  • instance.isEmpty 判断是否为空。
package Luwenzhen

import java.io.FileWriter

object class06 {
   /*
     实现一个日志类:Logger
     1.把一些操作信息写入到文本文件中
     2.实现单例模式
    */
  class Logger(filename:String) {
     def log(content:String):Unit={
       //把内容写入一个文件中
       val writer=new FileWriter(filename,true)
       writer.write(content+"\n")
       writer.close()
      // println(s"${content}")
     }
   }
  object  Logger {
    //定一个对象
     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 = {
      val logger1=  Logger("test.log")
      //val logger2=  Logger("test.log")
      //logger2.log("2005-11-5 09:06:03 不上课")
      logger1.log("2005-11-4 09:06:03 上课")
      logger1.log("2005-11-5 09:30:03 不上课")
      logger1.log("2005-11-6 09:45:03 运动会")

  }
}

运行后会得到一个test.log 的文件

屏幕截图 2025-11-04 092954.png