单例模式 | 学习笔记

简介: 快速学习单例模式

开发者学堂课程【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.getlnstance

val instance2 = SingleTon.getlnstance

接下来比较 instance1是否等于 instance2

if (instance1 == instance2) {

println("相等")

结果发现相等,说明是同一个对象,因此就实现了单例模式。

//将SingleTon的构造方法私有化

class SingleTon private(){}  (令SingleTon这个类只能有一个)

object SingleTon {//这个SingleTon对应的是SingLeTon$

private var s:SingleTon = null

懒汉式是先去获取,如果发现云等于空再去进行创建然后再返回。

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 {//SingleTon$

private val s: SingleTon2 = new SingleTon2

def getInstance = {

s

}

看一下底层,打开之后发现不用再先去判断是否为空再去创建,没有判断的逻辑了,核心代码为

public SinqleTon2 getIostance() {

return s() ;(直接返回,之前已经创建好了)

相关文章
|
SQL 数据可视化 BI
SQL语句及查询结果解析:技巧与方法
在数据库管理和数据分析中,SQL语句扮演着至关重要的角色
1676 0
|
存储 Python
数据包络分析(Data Envelopment Analysis, DEA)详解与Python代码示例
数据包络分析(Data Envelopment Analysis, DEA)详解与Python代码示例
|
2天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
254 116
|
17天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
11天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
650 220
|
4天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
298 25
Meta SAM3开源:让图像分割,听懂你的话