单例模式 | 学习笔记

简介: 快速学习单例模式

开发者学堂课程【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() ;(直接返回,之前已经创建好了)

相关文章
|
存储 编译器 C语言
【C/C++ 函数返回的奥秘】深入探究C/C++函数返回:编译器如何处理返回值
【C/C++ 函数返回的奥秘】深入探究C/C++函数返回:编译器如何处理返回值
1097 3
|
12月前
|
SQL 数据可视化 BI
SQL语句及查询结果解析:技巧与方法
在数据库管理和数据分析中,SQL语句扮演着至关重要的角色
1597 0
|
存储 Python
数据包络分析(Data Envelopment Analysis, DEA)详解与Python代码示例
数据包络分析(Data Envelopment Analysis, DEA)详解与Python代码示例
|
11月前
|
SQL 存储 关系型数据库
多态性在面向对象编程中的应用场景
多态性是面向对象编程的核心特性之一,允许使用同一接口表示不同类型的对象,提高代码的灵活性和可扩展性。常见应用场景包括:方法重写、接口实现、抽象类等,通过多态可以轻松管理复杂系统,实现软件组件的松耦合。
379 5
|
11月前
|
算法 编译器 C++
【C++11】lambda表达式
C++11 引入了 Lambda 表达式,这是一种定义匿名函数的方式,极大提升了代码的简洁性和可维护性。本文详细介绍了 Lambda 表达式的语法、捕获机制及应用场景,包括在标准算法、排序和事件回调中的使用,以及高级特性如捕获 `this` 指针和可变 Lambda 表达式。通过这些内容,读者可以全面掌握 Lambda 表达式,提升 C++ 编程技能。
495 3
|
11月前
|
存储 算法 安全
虚拟内存
【10月更文挑战第25天】虚拟内存是计算机系统中一项非常重要的技术,它通过扩展内存空间、提供内存保护和支持多任务处理等功能,提高了计算机系统的性能和可用性。虽然虚拟内存存在一些缺点,但通过合理的优化和管理,可以有效地发挥其优势,为计算机系统的稳定运行提供有力保障。
307 8
|
C++
C++一分钟之-类型别名与using声明
【7月更文挑战第20天】在C++中,类型别名和`using`声明提升代码清晰度与管理。类型别名简化复杂类型,如`using ComplexType = std::vector<std::shared_ptr<int>>;`,需注意命名清晰与适度使用。`using`声明引入命名空间成员,避免`using namespace std;`全局污染,宜局部与具体引入,如`using math::pi;`。恰当应用增强代码质量,规避常见陷阱。
255 5
|
XML 存储 JSON
(十二)探索高性能通信与RPC框架基石:Json、ProtoBuf、Hessian序列化详解
如今这个分布式风靡的时代,网络通信技术,是每位技术人员必须掌握的技能,因为无论是哪种分布式技术,都离不开心跳、选举、节点感知、数据同步……等机制,而究其根本,这些技术的本质都是网络间的数据交互。正因如此,想要构建一个高性能的分布式组件/系统,不得不思考一个问题:怎么才能让数据传输的速度更快?
643 1
|
C语言 C++ 开发者
C++基础知识(一:命名空间的各种使用方法)
C++在C的基础上引入了更多的元素,例如类,类的私密性要比C中的结构体更加优秀,引用,重载,命名空间,以及STL库,模板编程和更多的函数,在面向对象的编程上更加高效。C语言的优势则是更加底层,编译速度会更快,在编写内核时大多数都是C语言去写。 在C++中,命名空间(Namespace)是一种组织代码的方式,主要用于解决全局变量、函数或类的命名冲突问题。命名空间提供了一种封装机制,允许开发者将相关的类、函数、变量等放在一个逻辑上封闭的区域中,这样相同的名字在不同的命名空间中可以共存,而不会相互干扰。
245 0
|
存储 算法 Unix
虚拟内存管理
虚拟内存管理
230 0