go设计模式——单例模式

embedded/2024/9/18 1:57:10/ 标签: 设计模式, 单例模式, golang

概念

单例是一种创建型设计模式,它确保一个类在整个程序运行期间只有一个实例并提供一个全局访问点来使用该实例。虽然单例模式在某些情况下非常有用,例如管理全局配置、日志记录或资源共享,但它也带来了与全局变量相似的问题。具体来说,单例模式可能导致代码的模块化和可测试性下降,因为它在整个系统中引入了隐式依赖,使得代码难以解耦和扩展。因此,尽管单例模式可以简化某些设计,但在使用时需要谨慎,以避免对代码的灵活性和可维护性产生不良影响。

demo1

单例模式grpc的连接

package clientimport ("log""sync""google.golang.org/grpc""your/proto/package/path/example" // 更新为你的 proto 包路径
)type GRPCClient struct {conn   *grpc.ClientConnclient example.ExampleServiceClientmu     sync.Mutex
}var instance *GRPCClient
var once sync.Once// GetGRPCClient 返回 ExampleServiceClient 的单例实例
func GetGRPCClient() *GRPCClient {once.Do(func() {instance = &GRPCClient{}})// 获取锁来保护连接状态检查instance.mu.Lock()defer instance.mu.Unlock()// 如果连接为空或已关闭,则重新建立连接if instance.conn == nil || instance.conn.GetState() == grpc.Shutdown {conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure())if err != nil {log.Fatalf("Failed to connect to gRPC server: %v", err)}instance.conn = conninstance.client = example.NewExampleServiceClient(conn)}return instance
}// GetClient 返回 gRPC 客户端
func (g *GRPCClient) GetClient() example.ExampleServiceClient {return g.client
}// CloseConnection 关闭 gRPC 连接
func (g *GRPCClient) CloseConnection() error {g.mu.Lock()defer g.mu.Unlock()if g.conn != nil {err := g.conn.Close()g.conn = nil // 重置连接,确保下一次调用时可以重新连接return err}return nil
}

demo1

你想要在程序中创建一个“月亮”对象,并确保在整个程序运行期间,只有一个这样的“月亮”对象存在。这个对象应该是私有的,不可以被其他地方直接访问或修改。就是我们的desc是不允许外部修改的

package singletonimport "sync"// sync.Once 确保月亮单例实例只会被创建一次
var once sync.Once// moon 是一个不可导出的结构体
type moon struct {description string
}func (m *moon) String() string {return m.description
}// theMoon 是 moon 类型的单例实例
var theMoon *moon// TheMoon 返回月亮单例实例
func TheMoon() *moon {// 使用 sync.Once 确保 theMoon 只会被初始化一次once.Do(func() {theMoon = &moon{description: "美丽的月亮,照亮夜空。",}})return theMoon
}

使用场景

1. 全局配置管理

• 在应用程序中,配置通常是全局的,且不希望在多个地方加载配置文件。使用单例模式可以确保配置文件只被加载一次,并在应用程序的整个生命周期内共享同一个配置实例。

2. 日志记录

• 日志记录器通常需要在应用程序的不同部分被调用,但希望所有日志都通过同一个实例处理,以便统一管理日志的输出目标、格式等。单例模式可以保证只有一个日志记录器实例在整个程序中被使用。

3. 数据库连接池

• 数据库连接是一个昂贵的资源,通常希望应用程序共享一个连接池来管理数据库连接。通过单例模式,可以确保连接池实例在整个应用程序中是唯一的,并且被多个客户端共享。

4. 缓存管理

• 在一些应用中,缓存管理通常需要一个全局的管理对象来管理缓存数据。单例模式可以用于确保缓存管理对象在应用中只有一个实例,从而避免多次实例化带来的资源浪费。

5. 线程池

• 在并发编程中,线程池用于管理线程的复用,以避免频繁创建和销毁线程带来的开销。通过单例模式,可以确保线程池在整个应用中只有一个实例,并为所有任务共享。

6. 设备或资源管理

• 一些应用需要管理有限的设备或资源,如打印机、显卡等。这些设备通常不希望被多个实例同时控制,因此可以使用单例模式确保对设备的管理是通过单一实例完成的。


http://www.ppmy.cn/embedded/98331.html

相关文章

【C#】丢弃变量_

文章目录 正文推荐阅读 正文 在C#中,_ Task.Run(...); 这种写法通常用于当你启动一个异步任务但并不关心其结果或不想等待它完成时。这里的 _ 是一个丢弃变量(discard),它是C# 7.0及更高版本中引入的一个特性,用于表…

微信小程序:开发工具修改js编译后还是旧的js逻辑

1、清理所有缓存,重新导入项目 2、语法存在问题无法编译,导致内存堆积,无法自动编译 3、npm 存在问题,可以重新构建 4、有时候编译器也没报错都是一切正常,但是编译后依然不是最新。这个时候需要考虑下电脑是否存在问题&#xff0…

网易云音乐事故复盘---如何刷存在感

事件回顾 2024年8月19日 14:40 左右网易云音乐故障,无法访问; 15:00 左右门户网站www.163.com无法访问 15:08 网易云音乐官方发布公告,因基础设施故障 15:10 左右门户网站被转至M端m.163.com 17:10 网易门户和网易云音乐陆续恢复 17:…

【踩坑】如何解锁微软“已暂时锁定你的帐户”

登录微软账号时候,提示:有人在使用此帐户时输入错误密码的次数过多。为了保证帐户安全,我们已暂时锁定你的帐户,请稍后再试。 进入以下网站重置密码即可: https://account.live.com/ResetPassword.aspx?mktzh-CN 登录…

React渲染机制和源码初探(二)

接上篇React渲染机制和源码初探(一)_react19 19.0.0-rc.0-CSDN博客React的一些优秀架构思维,值得我们反复的去探讨,因为在其内部有很多很多的知识点。今天我们从react- reconciler这个包入手,开始分析React Fiber 架构…

【VRPCB】Python+Gurobi求解运输问题建模实践三

采用PythonGurobi求解带有集群回程需求的VRPCB问题 目录 1. 模型1.1 VRPB问题介绍1.2 数学模型1.2.1 模型参数1.2.2 数学模型1.2.3 模型分解 2. 数据结构3. Gurobi源码4. 求解结果参考 1. 模型 1.1 VRPB问题介绍 带有回程需求的VRP问题(VRP with Backhauls,VRPB)最…

GT口OOB(Out-of-Band)功能相关设置

Use RX OOB Signal Detection: 功能:启用内部OOB信号检测器。OOB信号检测在PCIe和SATA等接口中用于检测某些特殊信号,这些信号可能不遵循正常的数据传输协议,而是用于电源管理、链路训练或错误报告等目的。 应用场景:当…

MongoDB 创建数据库

MongoDB 创建数据库 MongoDB 是一种流行的 NoSQL 数据库,以其灵活的数据模型和强大的查询语言而闻名。在 MongoDB 中,创建数据库是一个简单的过程,可以通过 MongoDB 的命令行工具 mongo 或各种编程语言的 MongoDB 驱动程序来完成。本文将详细介绍如何在 MongoDB 中创建数据…

Postgres从A表复制到B表

1、create table b as select * from a; 2、pg_dump pg_dump pg_dump dbnamebpx -t pgbench_accounts > /pgdata/data/postgres-66b867fa/bpx_pgbench_accounts.sql PostgreSQL 复制表的 5 种方式详解

基于深度学习的图像特征优化识别复杂环境中的果蔬【多种模型切换】

文章目录 有需要本项目的代码或文档以及全部资源,或者部署调试可以私信博主项目介绍图像特征优化方法模型原理及实验对比模型训练每文一语 有需要本项目的代码或文档以及全部资源,或者部署调试可以私信博主 项目介绍 基于深度学习的图像识别技术广泛应…

【鸿蒙基础系列】鸿蒙基础组件

🐟作者简介:一名大三在校生,喜欢编程🪴 🐡🐙个人主页🥇:Aic山鱼 🐠WeChat:z7010cyy 🦈系列专栏:🏞️ 前端-JS基础专栏✨前…

Javaweb学习之JavaScript输出与字符串(二)

前情回顾 Javaweb学习之JavaScript(一)-CSDN博客 学习资源 w3school 在线教程 本期介绍 输出语句 在JavaScript中,有几种方式可以输出信息到控制台(console)、浏览器窗口(window)或其他地方。…

【本社翻译】Unity官方XR开发电子书

上个月(2024年7月),Unity 官方发布了一本聚焦 XR 开发的电子书,书名为《Create Virtual and Mixed Reality Experiences in Unity》。本书系统介绍了以 XR Interaction Toolkit 为代表的一系列 Unity XR 开发工具集,深…

【AI落地应用实战】Amazon SageMaker JumpStart 体验零一万物的 Yi 1.5 模型

目录 一、前言1.1、Amazon SageMaker JumpStart1.2、Yi-1.5 9B Chat 模型 二、Yi 1.5实践流程2.1、准备SageMaker Studio环境2.2、部署Yi-1.5-9B模型2.3、运行推理Yi-1.5-9B模型 三、体验总结 中国大模型公司零一万物发布开源大模型Yi-1.5,包含多个版本。同时发布多…

Python:读写操作

一、读写txt 模式: rawx 【读、加写(add 无则创建)、覆盖写、新创建写(无则报错)】 bt【可以和上面四个组合使用,分别代表‘读写都行’、‘二进制’、‘文本模式’】 with open(药品数据.txt,r,encodingu…

requests请求库使用

一、requests模块安装 安装requests库: 首先需要在Python环境中安装requests库。可以通过pip命令来安装 pip install requests二、repuests请求 发起GET请求: 使用requests库发送GET请求非常简单,只需要调用get()方法并传入要请求的URL即可。…

Xtuner微调llava-llama3-

最近尝试训练了一下llama3的多模态版本,主要参考的是官方教程:Tutorial/xtuner/llava/xtuner_llava.md at camp2 InternLM/Tutorial GitHub 官方教程讲解的已经很详细了,我这里只是简单说一下流程,主要还是讲解一下这个多模态版…

【Rust光年纪】探秘Rust GUI库:从安装配置到API概览

Rust语言GUI库全方位比较:选择适合你的工具 前言 在现代软件开发中,图形用户界面(GUI)库扮演着至关重要的角色。随着Rust语言的不断发展,越来越多的优秀的GUI库也相继问世,为Rust开发者提供了更多选择。本…

百度地图API快速使用 - 以批量算路为例讲解

目录 1. 开发文档链接 2. 开发流程说明 (1)首先-创建应用获取访问应用的AK (2) 查看文档的示例代码并分析 3. 简单改编示例的代码 1. 开发文档链接 批量算路 | 百度地图API SDK (baidu.com)https://lbsyun.baidu.com/faq/ap…

常见的GPU性能对比

写这篇博客的目的就是想搞清楚英伟达不同显卡之间的性能差异以及移动端GPU的性能达到了英伟达显卡的哪一代,让自己也让大家明白不同显卡的算力差异。所有的数据均从网络搜索,有不正确的地方欢迎批评指正。同一显卡会有一个首次发布,此外还有一…