单例模式案例-日志类

55 阅读1分钟

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

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

当写ClassName(arg1,arg2)时,编译器会自动翻译ClassName.apply(arg1,arg2),这可以让实例化代码更简单。

/*
* apply
* 作用:写在伴生对象中,就可以允许创建对象的时候,省略new
 */
object Class11 {
  //伴生类
  class logger() {}
  //伴生对象
  object logger {
    def apply():logger={
      println("logger.....")
      new logger
    }
  }

  def main(args: Array[String]): Unit = {
    //创建一个类的对象
    // val log1 = new logger()
    //在伴生对象中提供了apply方法,那么这里就会自动去调用它
  val log1 = logger()
  val log2 = logger()
  println(log1 == log2) //这里会输出false
  }
}

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

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

/*
* apply
* 作用:写在伴生对象中,就可以允许创建对象的时候,省略new
 */
object Class11 {
  //伴生类
  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