scala 基础十二 scala apply的使用,工厂方法和单例模式的实现

1. apply 可以用来实现类似于静态的初始化类的实例,请看下面实例

package smart.iot

class applyclass {

}

class A
{
    def apply()=println("hello class A");
}

object B
{
  def apply()=println("hello object B");
}

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

     //显示的调用 apply 方法
     B.apply()
     //直接加括号 也可以调用appy方法
     B();

     //实例化一个类A
    var a= new A()
    //显示调用 apply方法
     a.apply()
     //
     a()
  }
}

result:hello object Bhello object Bhello class Ahello class A

2.用apply实现工厂方法, 用apply对象静态的去实现 其他的类。不明白的请看示列

package smart.iot

class applyclass {

}

class A
{
    def test()=println("function test")
    def apply()=println("hello class A");
}

object B
{
  def apply()=println("hello object B");
}

//类似一个工厂方法,用C的apply 方法去实例化A
object C
{
  def apply()=new A()
}

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

   //类似于定义一个静态的方法初始化 ,用C去引用A的方法
   var  c=C()
   c.apply()
   c.test()
  }
}

3.用apply实现单例模式,下面我们来做一个测试。 分别用 c 和 c1引用伴生对象C

package smart.iot

class applyclass {

}

class A
{
    def test()=println("function test")
    def apply()=println("hello class A");
}

object B
{
  def apply()=println("hello object B");
}

//类似一个工厂方法,用C的apply 方法去实例化A
object C
{
  def apply()=new A()
}

object applyRun
{

    var  c=C()
    println(c.toString)
    var c1=C()
    println(c1.toString)
  }
}

result:
[email protected]
[email protected]

这样我们获取的其实是两个对象,每次应用C 都会实例化一些新的A对象,下面我们把它改成一个单例模式

package smart.iot

class applyclass {

}

class A
{
    def test()=println("function test")
    def apply()=println("hello class A");
}

object B
{
  def apply()=println("hello object B");
}

//类似一个工厂方法,用C的apply 方法去实例化A
object C
{
  //定义一个A对象 给一个默认值
  var a:A=_
  //如果a 被实现,new 一下A 如果已经实现了 就直接返回A 这样就实现了单利模式
  def apply()=if(a==null){a=new A();a}else a
}

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

    var  c=C()
    println(c.toString)
    var c1=C()
    println(c1.toString)
  }
}

result:
[email protected]
[email protected]
时间: 2024-10-23 07:56:47

scala 基础十二 scala apply的使用,工厂方法和单例模式的实现的相关文章

Java基础十二--多态是成员的特点

Java基础十二--多态是成员的特点 一.特点 1,成员变量. 编译和运行都参考等号的左边. 覆盖只发生在函数上,和变量没关系. Fu f = new Zi();System.out.println(f.num);//是父类,答案是3 2,成员函数(非静态). 编译看左边,运行看右边. 因为成员函数存在覆盖特性. Fu f = new Zi();//f.show();输出的是子类里面的show方法 3,静态函数. 编译和运行都看左边. 静态函数不具备多态性,多态性是对象的多态性,然后静态函数不涉

Bootstrap <基础十二>下拉菜单(Dropdowns)

Bootstrap 下拉菜单.下拉菜单是可切换的,是以列表格式显示链接的上下文菜单.这可以通过与 下拉菜单(Dropdown) JavaScript 插件 的互动来实现. 如需使用下列菜单,只需要在 class .dropdown 内加上下拉菜单即可.下面的实例演示了基本的下拉菜单: <!DOCTYPE html> <html> <head> <title>Bootstrap 实例 - 下拉菜单(Dropdowns)</title> <li

Mysql学习之十二:JDBC连接数据库之DriverManager方法

JDBC连接数据库 ?创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.lang.Class类的静态方法forName(String  className)实现. 例如: try{ //加载MySql的驱动类 Class.forName("com.mysql.jdbc.Driver") ; }catch(ClassNotFoundException e){ Sy

[Scala基础系列 06]Scala类和对象

1.类和构造函数 Scala中的类,基本概念与其他面向对象语言是一致的,不过在语法上有些不一样的地方.与Java等语言相比,Scala的类语法更简洁,使用起来也更方便. 1.1.类的基本语法 我们先来看一个简单的类定义和使用的代码. class ScoreCalculator { private var total, count = 0 def report(score: Int) { total += score count += 1 } def score = if (count == 0)

[Scala基础系列 04]Scala基本类型

1.Scala的数值类型 Scala的数值类型与Java类似,他们的范围与Java也是一致的.与Java不同的是,他们都是对象,是相应的数值类的实例.Scala通过富包装(Rich Wrapper)类给这些数值类型提供了强大的支持. 1.1.数值类型 Scala的数值类型和取值范围,见下表. Boolean: true 或者 false Byte: 8位, 有符号(2-7 ~ 27 - 1) Short: 16位, 有符号 (2-15 ~ 215 - 1) Int: 32位, 有符号 (2-31

第十二章类的无参方法

一.javaDoc注释: 语法:/** * *@author FLC */ 生成javaDoc文档的步骤:点击File--Export--展开java文件夹--选择javaDoc--点击Next--制定生成doc文档的文件位置--点击Fish--找到生成文件位置查看. 二.类中的方法: 语法:   访问修饰符  方法返回值类型  方法名称(){} 例如: public void run(){ } public String ball(){ } String ball="球"; retu

快学Scala 第二十二课 (apply和unapply)

apply和unapply: apply方法经常用在伴生对象中,用来构造对象而不用显式地使用new. unapply是当做是伴生对象的apply方法的反向操作.apply方法接受构造参数,然后将他们变成对象.而unapply方法接受一个对象,然后从中提取值.unapply方法返回的是一个Option. object ScalaRunner { def main(args: Array[String]): Unit = { testApply2() testApplyUnApply() testC

从大数据菜鸟走上大师的历程 Scala 第十二讲 trait

trait 类似于Java 中的Interface 但有差别 trait可以继承trait并且在trait 可以写抽象的方法,也可以具体实现方法 实例如下 trait Walk { def walk(){} } class person extends Walk {   println("hello -----")   override def walk(){println("Let's have a walk ")} } trait Run extends Wal

[Scala基础系列 07]Scala集合

Scala有一个非常通用,丰富,强大,可组合的集合库:集合是高阶的(high level)并暴露了一大套操作方法.很多集合的处理和转换可以被表达的简洁又可读,但不审慎地用它们的功能也会导致相反的结果.每个Scala程序员应该阅读 集合设计文档:通过它可以很好地洞察集合库,并了解设计动机. 1.数组(Array&ArrayBuffer) 1.1.Array 数组(Array)其实并不在scala.collection包里面,它属于scala包,直接对应于Java的数组,比如,Scala中的Arra