设计模式--单例模式(Singleton)【Go】

ops/2025/3/16 6:09:20/

 引言

设计模式中,单例模式(Singleton Pattern)是一种非常常见且实用的模式。它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这种模式在需要全局唯一对象的场景中非常有用,比如配置管理、日志记录、数据库连接池等。

本文将通过一个简单的 Go 示例,带你理解单例模式的基本概念和实现方法。即使你是设计模式的新手,也能轻松掌握!


什么是单例模式

单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取该实例。它的主要特点包括:

  1. 唯一性:整个程序中只有一个实例存在。
  2. 全局访问:通过一个静态方法或变量来访问该实例。

单例模式的核心思想是通过控制类的实例化过程,避免外部代码随意创建多个实例。


为什么需要单例模式

在某些场景中,我们需要确保一个类只有一个实例。例如:

  • 配置管理:程序的配置信息只需要加载一次,全局共享。
  • 日志记录:日志系统只需要一个实例来记录所有日志。
  • 数据库连接池:数据库连接池只需要一个实例来管理所有连接。

如果这些场景中允许多个实例存在,可能会导致资源浪费或数据不一致的问题。

Go实现单例模式

先从简单的单例模式入手,通过简单的锁机制实现单例

package mainimport ("fmt""sync"
)// 定义单例结构体
type Singleton struct{}// 全局变量,用于存储单例实例
var instance *Singleton
// 同步对象,确保单例实例只被创建一次
var once sync.Once// 获取单例实例的函数
func GetInstance() *Singleton {// 使用 once.Do 确保单例实例只被创建一次once.Do(func() {// 创建单例实例instance = &Singleton{}})// 返回单例实例return instance
}// 方法,用于打印单例实例的内存地址
func (s *Singleton) PrintAddress() {fmt.Println(s)
}func main() {// 获取单例实例singleton1 := GetInstance()// 打印单例实例的内存地址singleton1.PrintAddress()// 再次获取单例实例singleton2 := GetInstance()// 打印单例实例的内存地址singleton2.PrintAddress()// 打印单例实例的内存地址fmt.Println("Address:", singleton1)// 打印单例实例的内存地址fmt.Println("Address:", singleton2)
}

通过这个例子,你会发现singleton1和singleton2的地址相同

如果我们想通过单例模式来创建其他类实例,需要引入模板,参考下列代码。

假设我们需要创建一个Redis连接池,通过单例模式实现可以确保一个实例管理所有链接

package mainimport ("fmt""sync"
)// RedisConPool 结构体,实现单例模式
type RedisConPool struct{}// 单例实例
var instance *RedisConPool
// 用于保证线程安全的互斥锁
var once sync.Once// GetInstance 函数,获取单例实例
func GetInstance() *RedisConPool {once.Do(func() {// 只执行一次,创建单例实例instance = &RedisConPool{}fmt.Println("RedisConPool instance created!")})return instance
}// PrintAddress 方法,打印实例地址
func (r *RedisConPool) PrintAddress() {fmt.Printf("%p\n", r)
}func main() {// 获取单例实例redis1 := GetInstance()redis2 := GetInstance()redis1.PrintAddress()redis2.PrintAddress()// 比较两个单例实例fmt.Println("redis1 == redis2 ?", redis1 == redis2)
}

http://www.ppmy.cn/ops/166136.html

相关文章

MySQL开发陷阱与最佳实践:第1章:MySQL开发基础概述-1.2 MySQL开发环境搭建

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 第1章:MySQL开发基础概述1.2 MySQL开发环境搭建1.2.1 MySQL环境搭建方式对比与选型1.2.2 Windows环境搭建步骤详解1.2.2.1 官方安装包部署(以MySQL 8…

三分钟掌握视频剪辑 | 在 Rust 中优雅地集成 FFmpeg

前言 在当今的短视频时代,高效的视频剪辑已成为内容创作者和开发者的迫切需求。无论是裁剪视频开头结尾、提取高光时刻,还是制作 GIF、去除广告,剪辑都是必不可少的一环。 然而,批量处理大量视频并非易事,常见的挑战…

MD5、SHA、HMAC 加密算法及其在网页逆向分析中的应用

一、引言​ 在当今数字化时代,数据的价值愈发凸显,同时数据的安全与完整性保护也面临着严峻挑战。加密算法作为保障数据安全的基石,广泛应用于各个领域,从网络通信到数据存储,无处不在。MD5、SHA 和 HMAC 加密算法因其独特的特性和优势,成为了加密领域的重要成员。另一方…

Python的那些事第四十五篇:继承自Nose的测试框架Nose2

Nose2:继承自Nose的测试框架 摘要 本文深入探讨了Nose2这一继承自Nose的测试框架。在软件开发过程中,测试是确保代码质量和稳定性的重要环节,而测试框架为测试工作的开展提供了有力支持。Nose2作为Nose的继承者,在保留Nose优势的基础上进行了诸多改进和扩展,为Python测试…

高频面试题(含笔试高频算法整理)基本总结回顾21

干货分享,感谢您的阅读! (暂存篇---后续会删除,完整版和持续更新见高频面试题基本总结回顾(含笔试高频算法整理)) 备注:引用请标注出处,同时存在的问题请在相关博客留言…

前端高级CSS用法

前端高级CSS用法 在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交互和动态效果的关键技术之一。随着前端技术的不断发展,CSS的用法也日益丰富和高级。本文将深入探讨前端高级CSS的用法&a…

珠算与珠心算发展简介

珠算是中华传统优秀文化的科学遗产,它是我国劳动人民的伟大创造,被誉为中国的第五大发明,至今已有 1800 余年的历史。 珠算,是以算盘为工具,用手指拨动算珠进行数值计算的一门计算技术。同时,珠算又是一门科…

【区块链】btc

学习视频源链接: https://www.bilibili.com/video/BV1Vt411X7JF/ 本文是根据肖老师的视频进行的笔记记录 一、 cryptographic hash function 1.1. collision resistance抗碰撞性 : collision 指的是hash碰撞 抗碰撞性 (Collision Resistance) 是密码…