开发者学堂课程【Scala 核心编程 - 进阶:单例模式】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/610/detail/9135
单例模式
内容介绍:
一、单例模式含义
二、单例模式的应用场景
三、单例模式的应用案例
一、单例模式含义
单例模式是指:
保证在整个的软件系统中,某个类只能存在一个对象实例。
二、单例模式的应用场景
比如 Hibernate 的 SessionFactory,它充当数据存储源的代理,并负责创建Session 对象。
SessionFactory 并不是轻量级的,一般情况下,一个项目通常只需要一个SessionFactory 就够,这是就会使用到单例模式。
Akka [ActorySystem 单例]底层也是运用的单例模式,Actory system 对象不能有多个,一是因为没有意义,二是因为它是重量级的,在实际运用中,单例模式也是存在的。
三、单例模式的应用案例
Scala 中没有静态的概念,所以为了实现Java中单例模式的功能,可以直接采用类对象(即伴生对象)方式构建单例对象
新建一个包,取名为singleton
1)方式1-懒汉式
新建一个 Scala class,name为TestSingleTon,Kind为Object
object TestSingleTon {
val
instance1
= SingleTon.
g
etlnstance
val
instance2
= SingleTon.getlnstance
接下来比较 instance1是否等于 instance2
if (instance1 == instance2) {
println("相等")
结果发现相等,说明是同一个对象,因此就实现了单例模式。
//
将SingleTon的构造方法私有化
class SingleTon private()
{} (令
SingleTon
这个类只能有一个)
object SingleTon {
//这个
SingleTon
对应的是SingLeTon$
private var s:SingleTon = nu
ll
懒汉式是先去获取,如果发现云等于空再去进行创建然后再返回。
def getlnstance ={
if(s == null) {
s= new SingleTon
}
s}}
想要证明是懒汉式,需要查看底层代码,打开 Java Decompiler 工具,打开SingleTon$.class,怎么看是否是底层呢,打开以后发现里面的单例是private SingleTon,它并不是静态的,当去get一个instance的时候,使用s去进行获取,如果为空进行创建,如果不为空就返回,这就说明是之前java里面传统的懒汉式。
核心代码为
public singleTon getInstance() {
if (s() == null) {
s_ $eq(new singleTon());
}
return s();
2)方式2-饿汉式
新建一个新的 Scala class,name 为 TestSingleTon2,Kind为Object
//饿汉式
/
/
看底层
/*
object TestsingleTon2 {
def main(args: Array[string]): Unit = {
val instance1 = SingleTon2 .getInstance
val instance2 = SingleTon2 .getInstance
if (instance1 == instance2) {
println("相等~~")
}
*/运行过后发现代码是相等的
object SingleTon2 {
//S
ingleTon
$
private val s: SingleTon2 = new SingleTon2
def getInstance = {
s
}
看一下底层,打开之后发现不用再先去判断是否为空再去创建,没有判断的逻辑了,核心代码为
public SinqleTon2 getIostance() {
return s() ;(直接返回,之前已经创建好了)