设计模式go语言实现----单例模式Singleton

golang 单例模式-三种实现形式 定义 单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式,可以看到定义简单,算是设计模式中最简单的一个模式了。 饿汉模式 即还未使用该对象时,对象已经创建完成。 方法是通过golang 的init函数,在导包时就自动执行。 package mian import "fmt" var instanse *singler type singler struct { Name string } func NewSingler()*singler{ retur 阅读详情

1 单例模式定义

保证一个类仅有一个实例,并提供一个访问它的全局访问点

在这里插入图片描述

使用单例模式需要注意三个要点:

  • 某个类只能有一个实例
  • 这个类必须自行创建这个实例
  • 这个类必须自行向整个系统提供这个实例

单例模式写法:

  • 饿汉式:类在*编译时*创建自己的实例
  • 懒汉式:类在*运行时*创建自己的实例

依据以上,读者可以自行辨别下面的代码属于哪种写法

2 单例模式的gol语言实现

2.1 不考虑并发情况

package manager
import (
	"fmt"
)

var m *Manager

func GetInstance() *Manager {
	if m == nil {
		m = &Manager{}
	}
	return m
}

type Manager struct {
}

func (p Manager) Manage() {
	fmt.Println("manage...")
}

以上代码虽然实现了单例模式,在非并发的环境下执行,确实没有问题,但是考虑并发的情况,当第一个goroutine执行到m=&Manager{}之前,第二个gotoutine也来获取实例了,第二个gotoutine去判断m是不是等于nil,因为m=&Manager{}还没来得及执行,所以m=nil,那么if中的m = &Manager{}就可能会被执行两遍。
利用go的锁机制sync.Mutex修改以上代码。

2.2 考虑并发的情况

package manager
import (
	"fmt"
	"sync"
)

var m *Manager
var lock *sync.Mutex = &sync.Mutex{}

func GetInstance() *Manager {
	lock.Lock()
	defer lock.Unlock()
	if m == nil {
		m = &Manager{}
	}
	return m
}

type Manager struct {
}

func (p Manager) Manage() {
	fmt.Println("manage...")
}

这样修改之后,保证只有一个goroutine能够执行GetInstance函数,这样并发的问题就解决了,但是现在又有一个问题,每次goroutine来的时候都会被锁挡在GetInstance之外等上一个goroutine执行结束,这样代码执行效率肯定会下降,下面我们引入双重锁机制类修改我们的代码。

package manager
import (
	"fmt"
	"sync"
)

var m *Manager
var lock *sync.Mutex = &sync.Mutex{}

func GetInstance() *Manager {
	if m == nil {
		lock.Lock()
		defer lock.Unlock()
		if m == nil {
			m = &Manager{}
		}
	}
	return m
}

type Manager struct {
}

func (p Manager) Manage() {
	fmt.Println("manage...")
}

这样的话就避免了每次gouroutine过来的时候都需要加锁了。有的读者可能会问,为什么我们的代码里面需要执行两次m==nil的判断呢?试想一下当两个goroutine同时通过第一重m==nil判断的时候,由于锁机制,只有一个goroutine继续执行,另一个则在外排队等待,当第一个goroutine执行完毕之后,如果没有第二重m==nil判断的话,第二个goroutine也会继续执行语句m = &Manager{},这样就没有起到单例的目的了。
其实go语言中有一种机制可以保证代码只会被执行一次,而不需要我们手动加锁解锁,也就是go中的sync.Once,它的Do方法会保证传给它的函数只会被调用一次。

2.3 使用sync.Once改进

package manager
import (
	"fmt"
	"sync"
)

var m *Manager
var once sync.Once

func GetInstance() *Manager {
	once.Do(func() {
		m = &Manager{}
	})
	return m
}

type Manager struct {
}

func (p Manager) Manage() {
	fmt.Println("manage...")
}

有没有发现go代码很优雅的就实现了单例模式呢?

参考资料:
[1] 单例模式
[2] Go设计模式之单例模式
[3] 设计模式-单例模式(Go语言描述)

Go 设计模式代码示例 阅读详情

相关推荐

Go实战--Design Patterns in Golang 之单利模式(Singleton)

小插曲: 一猎头拉了个几百人的微信群,主要是沈阳、大连从事IT工作的人,以下是某几个时段的聊天截图: 回不去的东北……很多同事都说如果我选择回东北,肯定后悔,用不了多久还会回北京。 生命不止,继续 go go go !!! golang的基础知识介绍了很多很多了,主要是一些官方package的介绍。 golang的实战也介绍了很多很多了,包括了很多web框架,rest a

一蓑烟雨任平生 也无风雨也无晴 8147

Go语言实现单例模式

go语言实现单例模式

weixin_51195721的博客 2377

从示波器波形看懂死区:手把手教你调ST MCU的PWM,避免三相桥直通炸管

本文详细解析了如何通过示波器波形判断PWM死区时间,并手把手教你调整STM32高级定时器寄存器,避免三相逆变桥直通炸管。文章涵盖死区时间的本质与风险、STM32配置详解、示波器调试技巧及FOC系统中的特殊考量,帮助工程师优化电机驱动性能与安全性。

weixin_30315723的博客 733

《golang设计模式》第一部分·创建型模式-01-单例模式(Singleton)

指目标类(Class)只有一个实例对象(Object),并且向使用该对象的客户端提供访问单例的全局方法。

架构+开发+运维 1277

STC15单片机双串口通信实战:串口2配置与多设备交互

本文详细介绍了STC15单片机双串口通信的实战配置,重点解析串口2的硬件连接、寄存器设置及多设备交互实现。通过实际项目案例和完整代码示例,帮助开发者快速掌握STC15串口2的配置技巧,解决常见通信问题,提升嵌入式系统开发效率。

weixin_29174013的博客 255

时间序列:R语言ARMA-GARCH模型

ARMA: #读入数据,并绘制时序图 d<-read.table("C:/Users/haha/Desktop/R/zuoye/1.txt") x<-ts(log(d),start = 1) 1: x的时间序列图: x<-ts(log(d),start = 1) plot(x) 2: 从上图可以看出x.dif序列值在0的附近波动,没...

1万+

go语言实现设计模式—单例模式

go语言实现设计模式—单例模式1 背景2 什么是单例3 应用场景&优势4 如何创建单例4.1 饿汉式4.2 懒汉式-非线程4.3 懒汉式-线程安全4.4 双重检查4.5 once优雅写法5 其他 1 背景 2 什么是单例 3 应用场景&优势 4 如何创建单例 4.1 饿汉式 4.2 懒汉式-非线程 4.3 懒汉式-线程安全 4.4 双重检查 4.5 once优雅写法 5 其他 ...

catkin_ws的博客 1371

具身智能四大技术路线:VLA、大小脑、世界模型与强化学习

具身智能是机器人实现感知-决策-执行闭环的核心范式,其本质在于物理世界中的具身化交互能力。技术演进围绕如何高效建模环境、理解指令并生成鲁棒动作展开,衍生出四大主流路径:视觉-语言-动作(VLA)端到端学习、大小脑分层控制、世界模型驱动预测,以及强化学习原生策略优化。VLA强调多模态对齐与泛化能力,适合语义理解优先场景;大小脑架构兼顾实时性与可解释性,是工业落地的高可靠选择;世界模型追求内在物理模拟,代表长期认知跃迁方向;强化学习则扎根仿真试错,在力控、抓取等连续控制任务中展现强鲁棒性。本文聚焦这四大路线的技

weixin_32181267的博客 291

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

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

weixin_55418082的博客 1428

新手必看!一步步教您如何获取可用的D音Cookie(为什么我复制的D音Cookie无法正常使用?)

新手必看!一步步教您如何获取可用的抖音Cookie(为什么我复制的抖音Cookie无法正常使用,无法下载无水印视频?)

XiaoqiangClub的博客 1491

顶级AI大模型白嫖ChatGPT Plus1个月,0成本薅顶配功能

Chat*** Plus限时免费1个月!原价20美元/月的顶配功能

BUG猿的博客 7271

简单介绍Go 语言单例模式

使用两层的 instance == nil 的判断,再在中间加锁。第一层判断可以提告程序效率,不用每次都加锁,非 nil 就可以直接返回实例。第二层的判断就是为了解决并发安全的问题,解决多个协程 goroutine 同时都要加锁时,再由这二层做区分。所以当一个变量有且仅当第一次被访问时进行初始化,且只初始化一次,就可以使用 sync.Once 控制其初始化。使用 Golang 指针可以很容易的实现单例模式,通过指针保持相同的引用。解决并发安全最简单的方法就是加锁,可以使用 sync.Mutex 解决。

Free雅轩的博客 292

【YOLO26实战全攻略】10——YOLO26+SAM3实战:从检测到像素级分割的全流程指南(含PCB缺陷检测案例)

本文聚焦YOLO26与SAM3的融合应用,系统讲解“检测+分割”的三种核心模式:YOLO26原生分割(轻量高效)、YOLO26检测+SAM3精细分割(精度极致)、SAM3自动标注+YOLO26蒸馏(低成本冷启动)。从环境搭建、数据集准备、模型训练、性能优化到边缘部署,提供 step-by-step 实操教程,配套完整可运行代码与执行结果。结合虚拟PCB缺陷检测案例,展示像素级缺陷识别与几何参数测量的工业级应用流程。本文兼顾新手入门与进阶提升,注重实用价值,读者可直接参考搭建自己的分割系统。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 623

Go设计模式之:单例模式(singleton)

定义 单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。 需求分析 对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统...

林小默 470

pymol 动画简单制作,gif、mp4导出

参考: https://www.youtube.com/watch?v=G77K9Lro8js1、直接Movie下Program下,Camera Loop下Nutate下选择,这里选择30degover4 sec;如果要动画过渡自然,可以在这4sec后面再Append 1sec;如果需要两个视角,既可以再把窗口蛋白定位到比如配体,不用管中间过程怎么定位过去配体,再Program下,Camera Loop下Nutate下选择,这里选择30degover4 sec添加;最后如果要整体形成个循环播放,可以在这4s

weixin_42357472的博客 8435

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Golang与设计模式-Singleton单例模式

单例模式是我们工作中最长用到的设计模式之一,单例模式也是创建型设计模式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 通过单例模式可以保证系统中一个类只有一个实例且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。 单例模式一般分为两种实现方式:懒汉模式和饿汉模式 饿汉模式 表示程序在初始化阶段或使用前已创建出了一个实例,在程序后面的生命生命周期内将不再创建 // 声明

Lyon_Nee的博客 533

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

golang 设计模式-Creational

创建型模式:Singleton、Builder、Factory Method、Abstract Factory、Prototype Singleton 单例设计模式 having a unique instance of a type in the entire program 在整个程序中只具有某一类型的唯一实例 示例:唯一的计数器 package creational type singleton struct { count int } var instance *singleton func

後雪寒的专栏 883

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

单例模式-Go

单例模式——在整个程序中某类型只有唯一实例 描述 单例模式提供某类型的唯一实例,并且保证没有其他副本。在第一次调用实例的时候创建实例,该实例后续在程序其他地方被复用。 预期目标 我们需要某种特定类型的,单一的、共享的值。 在整个程序中某些类型的对象数量限制为一。 例子 下述例子中实现了一个具有唯一计数变量count的singleton。 其中Singleton为接口,所有实现了接口中定义的Ad...

LZX_Not_Afraid的博客 253

Go语言精进之路:23种设计模式的实战应用指南 [特殊字符]

Go语言以其简洁、高效、并发友好的特性,在现代软件开发中占据了重要地位。对于Go开发者来说,掌握设计模式是提升代码质量和架构能力的关键一步。本文将深入探讨Go语言中23种设计模式的实现方式,帮助你在实际项目中灵活运用这些经典模式。 ## 为什么要在Go语言中学习设计模式? 🤔 设计模式是软件开发中的最佳实践总结,它们提供了解决常见问题的可重用方案。在Go语言中,由于其独特的语言特性(如接口、

gitblog_00170的博客 331

Go常用的设计模式

常见的设计模式,如 **单例模式**、**工厂模式**、**策略模式**、**观察者模式**、**代理模式**、**装饰器模式** 和 **适配器模式** 都可以在 Go 中实现,适用于不同的开发需求。 这些设计模式不仅能帮助你编写结构清晰、可维护的代码,还能让你更好地应对复杂的编程问题。

有用的话关个注,点个赞,收个藏🫶。 1577

Golang 单例模式 singleton pattern

在Java中,单例模式的实现主要依靠类中的静态字段。在Go语言中,没有静态类成员,所以我们使用的包访问机制和函数来提供类似的功能。来看下下面的例子:package singleton import ( "fmt" ) ...

weixin_34319640的博客 122

单列模式--Singleton with Go

package main import ( "fmt" "sync" ) /* Singleton: 单例对象的类必须保证只有一个实例存在, 全局有唯一接口访问 1.懒汉模式:指全局的单例实例在第一次被使用是构建 缺点:非线程安全 */ type singleton struct{} var ins *singleton var once sync.Once func GetI...

Inc.Cool 309

python单例模式Singleton

转载自 https://blog.youkuaiyun.com/lqxqust/article/details/51910007 python单例模式Singleton Singleton模式即单例对象必须必须保证只有一个实例存在。可以说Singleton是设计模式中最基本一种设计模式,在学习设计模式时一般都会先了解该模式。在Python中实现单例模式有很多方法,下面简单总结以下,可以根据情况选择适合自己业务...

zhangji 305

单例模式(Singleton Pattern)

单例模式(Singleton Pattern) 用Go语言学习单例模式

非晓为骁的博客 178

go 设计模式(一)单例模式

go 的单例模式写法比较简单,可以通过sync.Once来辅助。 type Singleton struct { name string } var ( once sync.Once instance *Singleton ) func New() *Singleton { once.Do(func() { // once.Do 调用的函数只执行 1 次...

fengfengdiandia的专栏 727

大话设计模式 -- Golang实现

DesignPatternUse GO language to achieve 23 design patterns 该项目是拜读《大话设计模式》后,学习Golang语言实现的,有很多不足之处,有待完善 有些模式是根据UML图编写的基本框架,有些是基于特定的环境下编写的实例创建型模式 Abstract Factory抽象工厂模式:提供一个创建一系列相关或者相互依赖对象的接口,而无需指定他们具体的

aa779025105的专栏 7878
上一篇: 设计模式go语言实现----三类工厂模式Factory
下一篇: 设计模式go语言实现----构建者模式Builder
cloudUncle
博客等级 码龄8年 21粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值