go设计模式——单例模式

news2024/11/28 4:39:20

概念

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

demo1

单例模式grpc的连接

package client

import (
	"log"
	"sync"
	"google.golang.org/grpc"
	"your/proto/package/path/example" // 更新为你的 proto 包路径
)

type GRPCClient struct {
	conn   *grpc.ClientConn
	client example.ExampleServiceClient
	mu     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 = conn
		instance.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 singleton

import "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.coloradmin.cn/o/2062608.html

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

相关文章

【CSS】什么是1px问题,前端如何去解决它,如何画出0.5px边框?

1px 问题概述 在移动端开发中,1px 的边框在高 DPI 屏幕上可能会显得过粗,这是因为移动设备的像素密度(DPI)通常比传统的计算机屏幕高。在高 DPI 屏幕上,1px 实际上可能会被渲染为 2px 或更多,这使得边框看…

华为手机换ip地址怎么换?手机换ip地址有什么影响

在数字化时代,网络已成为我们生活中不可或缺的一部分。无论是日常沟通、工作学习还是娱乐休闲,我们都离不开互联网。然而,随着网络安全问题的日益突出,如何保护个人隐私和信息安全成为了用户关注的焦点。更换手机IP地址作为提升网…

Vue3+Vite 解决“找不到模块“@/components/xxx.vue”或其相应的类型声明 ts(2307)”

1. 安装插件 pnpm i types/node -D2. 修改vite.config.ts文件 import path from path;resolve: {alias: {"": path.resolve(__dirname,"./src"),},},3. 修改tsconfig.app.json文件 别人教的都是修改tsconfig.json文件,但是我发现可能是因为版…

NVF04M录音芯片在宠物喂食器的应用:录音播放功能,内置SPI闪存

在现代社会中,宠物已经成为人们生活中的一部分,而宠物喂食器作为宠物养护的重要工具,也越来越受到人们的关注。为了满足人们对宠物喂食器的多样化需求,九芯电子供应商研发了一款NVF04M录音芯片。它在宠物喂食器中的作用主要是提供…

巧用PDF转Markdown插件,在扣子(Coze)手搓一个有趣好玩的AI Bot

近期,TextIn团队开发的PDF转Markdown插件已经上架Coze平台。 短短的时间内,已经有不少朋友愉快地和我们的工具开始玩耍。今天我们抛砖引玉,介(an)绍(li)几种PDF转Markdown插件的有趣玩法&#…

通用情商智商性格测试ACCESS\EXCEL数据库

今天这个数据库记录数不太多,是个可以进行智商和情商测试的数据,也可以体验比较有趣的测试体验,整个测试主要是以回答不同方面的问题来分析的。智商测试和情商测试均采用国际标准试题,采用国际标准测试题目,通过回答不…

多模态模型评测框架lmms-eval发布!全面覆盖,低成本,零污染

随着大模型研究的深入,如何将其推广到更多的模态上已经成为了学术界和产业界的热点。最近发布的闭源大模型如 GPT-4o、Claude 3.5 等都已经具备了超强的图像理解能力,LLaVA-NeXT、MiniCPM、InternVL 等开源领域模型也展现出了越来越接近闭源的性能。 在…

NSSM 注册exe服务

参考链接:https://www.cnblogs.com/magicMaQaQ/p/18174409 下载NSSM:[NSSM - the Non-Sucking Service Manager](NSSM - the Non-Sucking Service Manager) 解压得到的压缩包 使用管理员权限运行 cmd,来到解压后的目录,执行nssm…

信息学奥赛知识点(十二)----栈和队列

一、栈 栈是只能在某一端插入和删除的特殊线性表。 用桶堆积物品,先堆进行的压在底下,随后一件一件往上堆。取走时,只能从上面一件一件取。堆和取都在顶部进行。底部一般是不动的。 栈就是一种类似桶堆积物品的数据结构,进行删…

Go 1.23 新特性:Timer 和 Ticker 的重要优化

作者:陈明勇 个人网站:https://chenmingyong.cn 文章持续更新,如果本文能让您有所收获,欢迎点赞收藏加关注本号。 微信阅读可搜《程序员陈明勇》。 这篇文章已被收录于 Github,欢迎大 家Star 催更并持续关注。 前言 G…

js 实现对一个元素得拉伸

前言: 最近写一个项目遇到了需要拉伸调整一个元素得大小(宽高)。所以打算实现一下。 思路就是用 mousedown、mousemove、mouseup 来实现。 mousemove是动态获取坐标,然后 动态改变元素宽度 js自己实现: html里实现…

CentOS7发送邮件如何配置SMTP服务器发信?

CentOS7发送邮件安全设置?CentOS7发信性能优化方法? 对于使用CentOS7操作系统的用户而言,配置SMTP服务器以发送邮件是一个关键步骤。AokSend将详细介绍如何在CentOS7中配置SMTP服务器发信的方法和注意事项。 CentOS7发送邮件:准…

C#发邮件时如何确保邮件内容的安全和隐私?

C#发邮件性能优化的策略?如何设置C#发邮件的功能? 在使用C#发邮件时,如何确保邮件内容不被泄露、篡改或非法访问,已成为开发者需要面对的关键问题。AokSend将探讨在C#发邮件过程中,确保邮件内容安全和隐私的几种有效方…

你也想转行成为一名程序员吗?作为过来人的我希望你想清楚这几个问题再做决定

1 有个朋友突然找我:“现在的工作不想干了,我现在转行搞IT能不能行?学哪个编程语言比较有前景?现在去搞网络安全应该没问题吧?”我相信,很多人出于各种原因都在考虑要不要进行职业转换,迷茫又焦…

2024年最新Pycharm专业版激活码+Pycharm详细安装汉化教程

一、PyCharm激活 激活码: KQ8KMJ77TY-eyJsaWNlbnNlSWQiOiJLUThLTUo3N1RZIiwibGljZW5zZWVOYW1lIjoiVW5pdmVyc2l0YXMgTmVnZXJpIE1hbGFuZyIsImxpY2Vuc2VlVHlwZSI6IkNMQVNTUk9PTSIsImFzc2lnbmVlTmFtZSI6IkpldOWFqOWutuahtiDorqTlh4blupflkI0iLCJhc3NpZ25lZUVtYWlsIjoi…

动态规划part13

647. 回文子串 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。 class Solution:def countSubstrings(self, s: str) -> int:dp [[Fa…

Chat App 项目之解析(九)

Chat App 项目介绍与解析(一)-CSDN博客文章浏览阅读468次,点赞12次,收藏3次。Chat App 是一个实时聊天应用程序,旨在为用户提供一个简单、直观的聊天平台。该应用程序不仅支持普通用户的注册和登录,还提供了…

ArcGIS小技巧:编辑一个面的边界时,如何让相邻面同步修改

欢迎关注同名微信公众号,更多文章推送: 在ArcGIS中手动编辑2个相邻面的共同边界时,通常需要2个面都跟着修改: 一般做法是用【整形要素工具】,但是【整形要素工具】不能选择多个要素执行,所以需要执行2次&am…

GoFly框架登录Token使用

token是验证请求接口用户身份的标识,框架建议开发者在识别用户身份时使用token尽量不要明文传用户标识数据。 一、生成用户登录token 通过routeuse.GenerateToken生成登录token,方法返回生成的token字符串和err错误提示,其中routeuse.UserC…

删除或丢失的移动硬盘数据如何恢复?三种办法助你找回宝贵资料

在数字化时代,移动硬盘已成为我们存储重要数据不可或缺的工具。然而,数据丢失或误删除的情况时有发生,让人倍感焦虑。别担心,本文将为你详细介绍如何恢复删除或丢失的移动硬盘数据,帮助你找回那些宝贵的资料。 一、检…