设计模式是针对软件设计中出现的常见问题的经过尝试和测试的解决方案。他们提供了一个模板或指南,用于以灵活且可重用的方式解决这些问题。
每种模式都代表了开发人员可以适应其特定环境的最佳实践。设计模式通常分为三大类。
为了开始这个系列,我们先来谈谈单例模式。
辛格尔顿
单例模式确保一个类只有一个实例,并提供对该实例的全局访问点。
这在您需要管理共享资源(例如数据库连接或配置设置)的情况下非常有用。
问题陈述
通常需要确保某个类仅存在一个实例,例如在管理配置或与硬件资源交互时。如果没有 singleton,创建多个实例可能会导致数据不一致或资源锁定等问题。
在使用异步代码时,这种情况很常见,其中多个 goroutine 可以创建类的新实例或访问共享资源。
现实世界的例子
考虑数据库连接池:如果应用程序的多个部分同时创建新连接,则最终可能会出现冗余或冲突的数据库交互。单例确保在整个应用程序中仅创建和使用一个连接。
执行
package main import ( "fmt" "sync" ) type Singleton interface { DoSomething() string } type singleton struct{} var lock = &sync.Mutex{} var instance *singleton func NewSingletonInstance() *singleton { if instance == nil { lock.Lock() defer lock.Unlock() if instance == nil { fmt.Println("Creating single instance now.") instance = &singleton{} } else { fmt.Println("Single instance already created.") } } else { fmt.Println("Single instance already created.") } return instance } func (s *singleton) DoSomething() string { return "Doing something." } func main() { instance1 := NewSingletonInstance() instance2 := NewSingletonInstance() fmt.Printf("%p\n", instance1) fmt.Printf("%p\n", instance2) }
登录后复制
函数 newsingletoninstance 确保仅创建一个单例实例,即使多次调用也是如此。
- 首先,它检查实例是否为零(即尚未创建实例)。
- 如果instance为nil,它会使用lock.lock()锁定该部分代码,以防止多个goroutine同时进入该部分。
- 锁定后,将执行第二次检查,以确保在第一次检查和获取锁之间没有其他 goroutine 创建该实例。
- 如果实例仍然为零,则创建一个新的单例实例并将其分配给全局变量。
- sync.mutex 和双重检查锁定确保单例实例的创建是线程安全的,防止多个 goroutine 创建单独的实例。
以上就是Go 设计模式#Singleton的详细内容,更多请关注抖狐科技其它相关文章!
-
如何取消app支付宝自动续费_app如何取消支付宝自动续费
支付宝 app 自动续费取消方法:通过支付宝 app 取消:打开 app,进入“我的”→“账单”→“自动扣款”,找到 app,点击“取消扣款”。通过 app store 取消(仅限 ios):打开 a...
-
崩坏星穹铁道竞锋舰书籍位置在哪 崩坏星穹铁道竞锋舰书籍位置介绍
崩坏星穹铁道竞锋舰书籍位置在哪?崩坏星穹铁道竞锋舰共有三本书籍需要玩家获取。很多小伙伴还不知道崩坏星穹铁道竞锋舰书籍位置在哪,下面给大家整理了崩坏星穹铁道竞锋舰书籍位置介绍,让我们一起来看看吧。崩坏星...
-
方舟生存进化时间代码
调时间代码介绍如下: 时间设定代码:SetTimeOfDay [时:分],例:settimeofday 8:00。输入代码后即可快进到你设定的时间。 以上就是方舟生存进化时间代码的详细内容,更多请关注...
-
Golang 函数并发编程的锁使用有哪些注意事项?
go 函数并发编程使用锁需注意:避免死锁:正确获取和释放锁。避免竞态条件:仅在获取锁后修改共享数据。考虑锁的粒度:细粒度锁并发性高但开销大。使用 rwmutex 实现读写锁:并发读取,独占写入。Go...
-
vm如何复制命令行
如何从 vm 复制命令行到本地系统?有两种方法:使用 vm 控制台:右键单击命令行并选择“复制”,然后在本地系统将其粘贴。使用第三方工具:使用 vmware workstation/fusion、vi...