golang创建式设计模式------单例模式

目录导航

      • 1.单例模式
        • 1)什么是单例模式
      • 2)使用场景
      • 3)实现方式
        • 1.懒汉式单例模式
        • 2.饿汉式
        • 3.双重检查式
        • 4.`sysc.Once`式
      • 4)实践案例
      • 5)优缺点分析

1.单例模式

1)什么是单例模式

单例模式(Singleton Pattern)是一种常用的设计模式。单例模式的类提供了一种访问其唯一对象的方法,该对象可以直接访问,无须实例化。单例模式保证了一个类的对象只存在一个,同时维护一个对其对象的全局访问点。

uml类图:

在这里插入图片描述

2)使用场景

  • 如果开发者想要更加严格地控制全局变量,则可以使用单例模式。单例模式可以保证一个类只存在一个实例。除了单例模式外,无法通过其他方式替换缓存的实例
  • 如果程序中的某个类对于所有客户端都只有一个可用的实例,则可以使用单例模式。在单例模式中,如果对象已经被创建,则返回已有的对象
  • 在设计数据库连接池时,可以使用单例模式。在数据库管理系统中使用数据库连接池,主要目的是节省打开或关闭数据库连接引起的效率损耗。这种效率上的损耗还是非常巨大的,如果使用单例模式来进行维护的话,则可以大大减少这中类似的损耗。

3)实现方式

在golang中,单例模式的实现方式有4中,分别是懒汉式、饿汉式、双重检查式、和sysnc.Once。而这四种单例模式都有一个共同的特征:只实例化一次,只允许一个实例存在。

1.懒汉式单例模式

懒汉式单例模式指的是在创建对象时,不直接创建对象,在加载配置文件时才创建对象。

package typesofSigtonimport "sync"type singleton struct{value int
}
//声明私有指令
var instance *singleton
//加锁的目的是保证协成并发安全
//mo1.声明锁对象
var mutex sync.Mutex
//获取单例对象
func GetInstance() *singleton {//加锁,保证协成安全mutex.Lock()defer mutex.Unlock()if instance==nil{instance=new (singleton)}return instance
}

以上代码通过加锁的方式保证了协成的并发安全但是代码有一个问题就是每次调用该方法都需要进行加锁的操作,在性能上则不够高效。

2.饿汉式

饿汉式是指,在创建对象时,不判断创建的对象是否为空,直接创建对象。饿汉式是并发安全的,其唯一的缺点是在导入包的同时会创建对象,并且创建的对象会持续存储于内存当中。饿汉式单例模式可以使用初始化init()函数实现

package typesofSigtonimport "fmt"//var instance *singleton
func init(){if instance==nil{instance=new(singleton)fmt.Println("创建单个实例")}
}//编写提供实力的函数
func GetInstance() *singleton {return instance
}
3.双重检查式

在懒汉式的基础上进行优化,减少加锁的操作,这样可以在保证并发安全的同时不影响性能,这种模式也被称为双重检查单例模式

package typesofSigtonimport ("fmt""sync"
)
//声明锁对象
var mutex sync.Mutex
//当对象为空时,对对象进行加锁操作;在创建好对象后,在获取对象时就不用加锁了
func GetIntance() *singleton{if instance ==nil{mutex.Lock()if instance==nil{instance=new(singleton)fmt.Println("创建单个实例")}mutex.Unlock()}return instance
}
4.sysc.Once

sysc.Once是go标准库提供的使函数只执行一次的实现,通常应用于单例模式,如初始化配置、保持数据库连接等。其作用与init()函数类似,但有区别。init()函数会在其所在的包首次被加载时执行,如果被加载的包不立即被使用,那么既浪费了内存空间,又延长了程序加载时间。

sysc.Once可以在代码的任意位置被初始化和调用,在并发场景中是并发安全的,使用sysc.Once对象的Do()方法创建实例,可以确保创建对象的方法只被执行一次

package typesofSigtonimport ("fmt""sync"
)
var once sync.Once
func GetIntance() *singleton{once.Do(func() {instance=new(singleton)fmt.Println("创建单个实例")})return instance
}

4)实践案例

excample.go

package excampleimport ("fmt""sync"
)var lock = &sync.Mutex{}type singleton struct {
}var instance *singleton// 获取实例对象
func GetInstance() *singleton {if instance == nil {lock.Lock()defer lock.Unlock()if instance == nil {fmt.Println("创建单个实例")instance = new(singleton)} else {fmt.Println("已创建单个实例")}} else {fmt.Println("已创建单个实例")}return instance
}

main.go

package mainimport ("Signton/excample""fmt"
)func main() {for i := 0; i < 3; i++ {go excample.GetInstance()}fmt.Scanln()
}//运行结果为
//创建单个实例
//已创建单个实例
//已创建单个实例

5)优缺点分析

优点:

  • 单例模式可以扩展为工厂模式。
  • 由于系统的内存中只存在一个对象,因此对于需要频繁创建和销毁对象的系统,使用单例模式可以提升系统的性能

缺点:

  • 由于单例模式不是抽象的,因此其扩展性较低
  • 滥用单例模式会产生一些负面问题。例如,为了节省资源,如果使用单例模式设计数据连接池对象,则可能会导致共享连接池对象过多且没有被释放的场景,从而出现连接池溢出的问题。此外,如果实例化的对象长时间不被使用,那么他可能会被操作系统认为是垃圾对象而回收,从而导致对象缺失。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/11866.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】线性表--顺序表(二)

文章目录 1、什么是线性表2、线性表的基本操作3、顺序表3.1、顺序表的定义3.2、顺序表的实现方式&#xff1a;静态分配3.3、顺序表的实现方式&#xff1a;动态分配3.4、顺序表的特点3.5、顺序表的初始化与插入操作3.6、顺序表的删除与查询 1、什么是线性表 ​ 线性表是具有相同…

通过EXCEL控制PLC启停电机的一种方法

概述 本例将介绍用微软EXCEL电子表格控制西门子S7-1200 PLC实现电机启停的一种方法。 第1步&#xff1a; 添加PLC设备&#xff0c;选择西门子S7-1214C CPU&#xff0c;设置IP地址&#xff1a;192.168.18.18&#xff0c;子网掩码&#xff1a;255.255.255.0。 第2步&#xff1a…

vue3中通过自定义指令实现loading加载效果

前言 在现代Web开发中&#xff0c;提升用户体验一直是开发者们追求的目标之一。其中&#xff0c;一个常见的场景就是在用户与应用程序进行交互时&#xff0c;特别是当进行异步操作时&#xff08;如网络请求&#xff09;&#xff0c;为用户提供即时的反馈&#xff0c;避免用户因…

【循环程序设计-谭浩强适配】(适合专升本、考研)

无偿分享学习资料&#xff0c;需要的小伙伴评论区或私信dd。。。 无偿分享学习资料&#xff0c;需要的小伙伴评论区或私信dd。。。 无偿分享学习资料&#xff0c;需要的小伙伴评论区或私信dd。。。 完整资料如下&#xff1a;纯干货、纯干货、纯干货&#xff01;&#xff01;…

浅谈电动汽车充电站的电气安全

1 引言 1月14日日上午10点左右&#xff0c;青岛市市北区辽宁路63号公交停车场内&#xff0c;一辆报废公交车突然起火&#xff0c;由于大风天气&#xff0c;大火很快引燃了停在旁边的几辆报废车。消防人员快速赶到&#xff0c;迅速控制住火势。11时30分&#xff0c;停车场内的…

鸿蒙内核源码分析(ELF格式篇) | 应用程序入口并不是main

阅读之前的说明 先说明&#xff0c;本篇很长&#xff0c;也很枯燥&#xff0c;若不是绝对的技术偏执狂是看不下去的.将通过一段简单代码去跟踪编译成ELF格式后的内容.看看ELF究竟长了怎样的一副花花肠子&#xff0c;用readelf命令去窥视ELF的全貌&#xff0c;最后用objdump命令…

Image to Music V2 :只需上传一张照片,自动转换成与图片内容匹配的音频!

前言 我们之前肯定已经见过了很多文本生成图片、文本生成声音以及AI翻唱歌曲 等多种AI产品&#xff08;模型&#xff09;。 其实音乐和图片从某种意义上来说都是艺术创作的一种形式&#xff0c;它们可以相互配合&#xff0c;共同呈现出一种更加丰富、感性的表达方式。 将图片…

弘君资本:人形机器人概念走强,盛通股份涨停,怡合达、鼎智科技等拉升

人形机器人概念14日盘中拉升走高&#xff0c;到发稿&#xff0c;盛通股份涨停&#xff0c;怡合达、鼎智科技涨约6%&#xff0c;索辰科技、伟创电气、丰立智能等涨超4%。 音讯面上&#xff0c;5月13日&#xff0c;宇树发布人形智能体Unitree G1&#xff0c;身高127cm,体重35kg&…

618值得入手的数码产品怎么选?2024 买过不后悔的数码好物分享

在数字时代的浪潮中&#xff0c;每一次的购物狂欢节都如同一场科技盛宴&#xff0c;让我们有机会接触到最前沿、最实用的数码产品&#xff0c;而“618”无疑是这场盛宴中最为引人瞩目的日子之一。面对琳琅满目的商品&#xff0c;如何选择那些真正值得入手的数码好物&#xff0c…

易宝OA-ExecuteQueryForDataSetBinary处sql注入

免责声明&#xff1a; 本文内容为学习笔记分享&#xff0c;仅供技术学习参考&#xff0c;请勿用作违法用途&#xff0c;任何个人和组织利用此文所提供的信息而造成的直接或间接后果和损失&#xff0c;均由使用者本人负责&#xff0c;与作者无关&#xff01;&#xff01;&#…

Centos 安装jenkins 多分支流水线部署前后端项目

1、安装jenkins 1.1 安装jdk 要求&#xff1a;11及以上版本 yum install yum install java-11-openjdk 1.2 安装jenkins 导入镜像 sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo出现以下错误 执行以下命令 sudo yum …

使用java远程提交flink任务到yarn集群

使用java远程提交flink任务到yarn集群 背景 由于业务需要&#xff0c;使用命令行的方式提交flink任务比较麻烦&#xff0c;要么将后端任务部署到大数据集群&#xff0c;要么弄一个提交机&#xff0c;感觉都不是很离线。经过一些调研&#xff0c;发现可以实现远程的任务发布。…

LOTO示波器软件PC缓存(波形录制与回放)功能

当打开PC缓存功能后, 软件将采用先进先出的原则排队对示波器采集的每一帧数据, 进行帧缓存。 当发现屏幕中有感兴趣的波形掠过时, 鼠标点击软件的(暂停)按钮, 可以选择回看某一帧的波形。一帧数据的量 是 当前用户选择时基档位缓冲区总数据大小。不同时基档位缓冲区大小不同&am…

强化学习——马尔可夫过程的理解

目录 一、马尔可夫过程1.随机过程2.马尔可夫性质3.马尔可夫过程4.马尔可夫过程示例 参考文献 一、马尔可夫过程 1.随机过程 随机过程是概率论的“动态”版本。普通概率论研究的是固定不变的随机现象&#xff0c;而随机过程则专注于那些随时间不断变化的情况&#xff0c;比如天…

R语言两种方法实现随机分层抽样

为了减少数据分布的不平衡&#xff0c;提供高样本的代表性&#xff0c;可将数据按特征分层一定的层次&#xff0c;在每个层次抽取一定量的样本&#xff0c;为分层抽样。分层抽样的特点是将科学分组法与抽样法结合在一起&#xff0c;分组减小了各抽样层变异性的影响&#xff0c;…

C语言指针详解(三)

目录 前言 一. 回调函数是什么&#xff1f; 1.定义 2. 代码示例&#xff1a;计数器 2.1 使用回调函数改造前 2.2 使用回调函数改造后 二. qsort使用举例 1. qsort介绍 2. 使用qsort函数排序整型数据 3. 使用qsort排序结构体数据 三. qsort函数的模拟实现 四. sizeo…

代码随想录:螺旋矩阵II相关题目推荐(54、LCR146)

59.螺旋矩阵II 题目 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]] 代码&#xff08;新解法&am…

MyBatis——MyBatis 参数处理

一、单个简单类型参数 简单类型包括&#xff1a; byte short int long float double char Byte Short Integer Long Float Double Character String java.util.Date java.sql.Date parameterType 属性&#xff1a;告诉 MyBatis 参数的类型 MyBatis 自带类型自动推断机制…

LLM应用-prompt提示:生成搜索相关问题、生成回答格式包含参考资料

参考: https://isou.chat/ (AI回答与相关问题都是根据问题的搜索引擎结果结合大模型生成的) prompt参考: https://github.com/yokingma/search_with_ai/blob/6d32aa8f05f5f6ee12b5204787035b3f7797c22a/src/prompt.ts#L8 ##rag 根据搜索结果知识回答RagQueryPrompt = ` …

程控水冷阻性负载主要工作方式

程控水冷阻性负载是一种先进的电力设备&#xff0c;主要用于电力系统的测试和研究。它的主要工作方式是通过控制水冷系统的温度&#xff0c;来模拟不同的阻性负载条件&#xff0c;从而对电力设备进行各种性能测试。 首先&#xff0c;我们需要了解什么是阻性负载。阻性负载是指那…