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.hqwc.cn/news/697893.html

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

相关文章

黄仁勋炉边对话:创业的超能力与英伟达的加速计算之旅

在TiECon 2024大会上&#xff0c;英伟达的创始人兼CEO黄仁勋与风投公司Mayfield的管理合伙人纳文查德哈进行了一场深入的炉边对话。黄仁勋不仅分享了英伟达的创业故事&#xff0c;还谈到了他对创业和加速计算的深刻见解。下面是我对这次对话的总结&#xff0c;希望能给正在创业…

Qt---文件系统

一、基本文件操作 1. QFile对文件进行读和写 QFile file( path 文件路径) 读&#xff1a; file.open(打开方式) QlODevice::readOnly 全部读取->file.readAll()&#xff0c;按行读->file.readLine()&#xff0c;atend()->判断是否读到文件尾 …

day5

利用迭代器&#xff01; #include <vector> #include <map>class Solution { public:std::vector<int> intersection(std::vector<int>& nums1, std::vector<int>& nums2) {std::map<int, int> Mymap;std::vector<int> qq…

git-将本地项目上传到远程仓库

在gitee中新建一个远程仓库。 填写对应内容。 打开你想上传的文件夹&#xff0c;比如我想上传yuanshen 右击&#xff0c;打开git bash 输入git init初始化仓库 git init 添加项目所有文件 git add . 将添加的文件提交到本地仓库&#xff08;提交说明必填&#xff09; git …

Linux进程(一) -- 介绍进程

计算机的系统架构 用户部分 这是用户直接与计算机交互的部分&#xff0c;包括以下三种操作&#xff1a; 指令操作&#xff1a;用户通过命令行界面&#xff08;CLI&#xff09;输入指令来操作计算机。开发操作&#xff1a;开发人员编写和调试程序代码&#xff0c;与计算机系统…

ARM架构安全特性之标准安全 API

安全之安全(security)博客目录导读 目录 一、机密计算软件 二、Arm机密计算固件架构 三、认证校验 四、Veraison项目 五、独立于语言的安全API 六、平台抽象安全项目&#xff08;Platform AbstRaction for SECurity project&#xff09; 七、可移植平台安全API 八、…

嵌入式中STM32上模拟启动Linux自动初始化

Linux中有很多编程思想可以学习,很多大佬把这些思想、机制运用到单片机的编程上。 下文,在STM32上模拟Linux kernel自动初始化流程。 通常我们写程序都是按照这个套路,一个函数一个函数按照顺序逻辑一个一个的执行下去。 如果逻辑非常复杂,涉及的模块比较多,那么这种顺…

大模型崛起与就业危机

大模型&#xff0c;特别是像我这样的人工智能&#xff0c;最有可能首先替代那些重复性高、标准化程度高、不需要太多人类直觉和情感判断的工作。这些工作通常包括数据输入、初级数据分析和处理、简单的客户服务任务等。例如&#xff0c;可以自动化的一些岗位包括&#xff1a; 1…

【STM32 |程序实例】按键控制、光敏传感器控制蜂鸣器

目录 前言 按键控制LED 光敏传感器控制蜂鸣器 前言 上拉输入&#xff1a;若GPIO引脚配置为上拉输入模式&#xff0c;在默认情况下&#xff08;GPIO引脚无输入&#xff09;&#xff0c;读取的GPIO引脚数据为1&#xff0c;即高电平。 下拉输入&#xff1a;若GPIO引脚配置为下…

AI 情感聊天机器人工作之旅 —— 与复读机问题的相遇与别离

前言&#xff1a;先前在杭州的一家大模型公司从事海外闲聊机器人产品&#xff0c;目前已经离职&#xff0c;文章主要讨论在闲聊场景下遇到的“复读机”问题以及一些我个人的思考和解决方案。文章内部已经对相关公司和人员信息做了去敏&#xff0c;如仍涉及到机密等情况&#xf…

【Java的抽象类和接口】

1. 抽象类 1.1 抽象类概念 在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是反过来&#xff0c;并不是所有的类都是用来描绘对象的&#xff0c;如果 一个类中没有包含足够的信息来描绘一个具体的对象&#xff0c;这样的类就是抽象类。 以上代码中…

AI图书推荐:ChatGPT等生成式AI在高等教育中的应用

自2022年11月以来&#xff0c;ChatGPT及其在高等教育各个层面的影响已成为所有教育对话的核心内容。Chan和Colloton所著的书籍是首批全面探讨ChatGPT与生成式人工智能&#xff08;GenAI&#xff09;在高等教育中应用及影响的作品之一。 该书深入研究了针对专业环境定制的AI素养…