Golang设计模式之单例模式详细讲解

作者:Ch3n 时间:2024-02-20 01:10:16 

单例模式

单例是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。

单例拥有与全局变量相同的优缺点。 尽管它们非常有用, 但却会破坏代码的模块化特性。

在某些其他上下文中, 你不能使用依赖于单例的类。 你也将必须使用单例类。 绝大多数情况下, 该限制会在创建单元测试时出现。

Golang设计模式之单例模式详细讲解

概念示例

通常而言, 单例实例会在结构体首次初始化时创建。 为了实现这一操作, 我们在结构体中定义一个 getInstance获取实例方法。 该方法将负责创建和返回单例实例。 创建后, 每次调用 getInstance时都会返回相同的单例实例。

协程方面又有什么需要注意的吗? 每当多个协程想要访问实例时, 单例结构体就必须返回相同的实例。 正因如此, 单例设计模式的实施工作很容易出错。 下方的例子表示了创建单例的正确方式。

一些值得注意的地方:

最开始时会有 nil检查, 确保 singleInstance单例实例在最开始时为空。 这是为了防止在每次调用 getInstance方法时都去执行消耗巨大的锁定操作。 如果检查不通过, 则就意味着 singleInstance字段已被填充。

singleInstance结构体将在锁定期间创建。

在获取到锁后还会有另一个 nil检查。 这是为了确保即便是有多个协程绕过了第一次检查, 也只能有一个可以创建单例实例。 否则, 所有协程都会创建自己的单例结构体实例。

single.go: 单例

package main
import (
   "fmt"
   "sync"
)
var lock = &sync.Mutex{}
type single struct {
}
var singleInstance *single
func getInstance() *single {
   if singleInstance == nil {
       lock.Lock()
       defer lock.Unlock()
       if singleInstance == nil {
           fmt.Println("Creating single instance now.")
           singleInstance = &single{}
       } else {
           fmt.Println("Single instance already created.")
       }
   } else {
       fmt.Println("Single instance already created.")
   }
   return singleInstance
}

main.go: 客户端代码

package main
import (
"fmt"
)
func main() {
   for i := 0; i < 30; i++ {
       go getInstance()
   }
   // Scanln is similar to Scan, but stops scanning at a newline and
   // after the final item there must be a newline or EOF.
   fmt.Scanln()
}

output.txt: 执行结果

Creating single instance now.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.

来源:https://ch3nnn.blog.csdn.net/article/details/126905774

标签:Go,单例模式,设计模式
0
投稿

猜你喜欢

  • 详解如何使用beego orm在postgres中存储图片

    2024-04-25 15:14:46
  • 详解用Python处理Args的3种方法

    2023-01-21 17:10:10
  • pandas学习之txt与sql文件的基本操作指南

    2022-08-03 18:57:50
  • python中的property及属性与特性之间的优先权

    2023-02-03 02:36:12
  • Python return函数返回值类型和帮助函数使用教程

    2021-01-13 14:21:32
  • 教你如何编写Vue.js的单元测试的方法

    2024-04-26 17:38:09
  • python编写实现抽奖器

    2023-02-25 00:44:45
  • MySQL中创建表的三种方法汇总

    2024-01-21 09:40:35
  • Python设计模式之备忘录模式原理与用法详解

    2022-12-27 11:12:01
  • sql 自定义百分比转换小数函数代码

    2011-09-30 11:54:01
  • 深入了解如何基于Python读写Kafka

    2021-02-13 09:33:09
  • 彻底弄懂Python中的回调函数(callback)

    2021-02-26 23:51:57
  • python3 读取Excel表格中的数据

    2021-01-14 23:03:42
  • php面向对象程序设计介绍

    2023-05-25 05:31:11
  • 通过ASP.net实现flash对数据库的访问

    2024-01-14 17:04:30
  • Python给你的头像加上圣诞帽

    2023-08-28 11:30:41
  • Python创建系统目录的方法

    2023-11-22 11:52:47
  • Python使用三种方法实现PCA算法

    2022-06-26 13:32:49
  • php之redis短线重连案例讲解

    2023-06-12 13:16:04
  • python中强大的format函数实例详解

    2022-02-19 18:47:10
  • asp之家 网络编程 m.aspxhome.com