单例设计模式-Golang

首页 2024-07-10 10:22:47

单例设计模式是软件编程中最重要、最常用的设计模式之一。它确保应用程序运行中只有一个例子,并为例子提供全球访问点。在本文中,我们将讨论它 Singleton 如何重要 Golang 它的实现,以及它带来的好处,特别是在并发环境中。

什么是单例?

单例是一种将类型的实例限制为单个实例的设计模式。它在需要单点控制或共享资源时特别有用,例如:

  • 需要集中应用程序设置配置管理器。
  • 有限数量的连接必须有效地管理数据库连接池。
  • 日志的一致性在记录器中非常重要。
为何使用单例?

我会列出一些关于 Pattern 更有意义的观点也表明,并非一切都是美丽的,我们可能会遇到一些问题。

好处
  • 整体一致性:确保应用程序的所有点都使用相同的例子来提供数据和行为的一致性。
  • 访问控制:集中控制实例的创建和访问,方便对象生命周期的维护和管理。
  • 资源效率:避免创建不必要的例子,节省内存和处理资源。
缺点
  • 测试难度:单例会使编写单元测试更加困难,因为它们引入了需要管理的整体状态。
  • 增加耦合:过度使用单例会使组件之间的耦合更加紧密,使应用程序难以维护和开发。
实现单例

为了实现单例,我将使用它 Golang。在这种语言中,我们必须特别注意并发性,以确保只创建一个例子,即使是多个例子 goroutine 同时尝试访问这个例子也是如此。

为了让我们的例子更接近现实世界,让我们为我们的应用程序创建一个记录器。记录器是应用程序中常用的工具,需要确保日志的一致性。

1 - 定义结构

第一,我们定义了我们希望有一个单一的例子结构。

包记录器

进口 (
    “FMMT”
    “同步”
)

类型记录器结构{}

var loggerInstance *Logger
2 - Newinstance函数

Newinstance函数负责返回Singleton结构的单个例子。我们使用互斥锁来确保并发环境的安全,并实现双重检查锁,以提高效率。

包记录器

进口 (
    “FMMT”
    “同步”
)

类型记录器结构{}

var 记录器*记录器
var mtx = &sync.Mutex{}

func NewInstance() *记录器 {
    如果记录器 == nil {
        mtx.Lock()
        延迟 mtx.Unlock()
        如果记录器 == nil {
            fmt.Println("创建新的记录器")
            记录器=&记录器{}
        }
    } 别的 {
        fmt.Println("已经创建了记录器")
    }
    返回记录器
}
3 - 实现日志类型

日志工具总是有一些日志类型,如Info只显示信息、Eror显示错误等。这也是过滤我们想要在应用程序中显示的信息类型的一种方法。

所以让我们创建一个显示它的方法 Info 类型的日志。为此,我们将创建一个接收日志信息的函数,并将其格式化为 INFO 格式。

包记录器

进口 (
    “FMMT”
    “同步”
    “团队”
)

常量(
    信息字符串 =“信息”
)

类型记录器结构{}

var 记录器*记录器
var mtx = &sync.Mutex{}

func NewInstance() *记录器 {
    如果记录器 == nil {
        mtx.Lock()
        延迟 mtx.Unlock()
        如果记录器 == nil {
            fmt.Println("创建新的记录器")
            记录器=&记录器{}
        }
    } 别的 {
        fmt.Println("已经创建了记录器")
    }
    返回记录器
}

func (l *Logger) Info(消息字符串) {
    fmt.Printf("%s - %s: %sn", time.Now().UTC().Format(time.RFC3339Nano), INFO, 消息)
}
4 - 使用记录器

为了使用我们的新记录器,我们将在主包中实例化它,并创建一个日志来检查它是如何工作的。

包主

进口 (
    “playground-go/pkg/logger”
)

函数主() {
    日志 := logger.NewInstance()
    log.Info("这是日志的例子")
}

这是我们运行程序时的结果:

创建新的记录器
2024-07-03T19:34:57.609599Z - 信息:这是日志的例子

如果我们想测试Newinstance是否真的保证只有一个例子在运行,我们可以做以下测试。

包主

进口 (
    “FMMT”
    “playground-go/pkg/logger”
)

函数主() {
    日志 := logger.NewInstance()
    log.Info("这是日志的例子")

    log2 := logger.NewInstance()
    log2.Info("这是日志的另一个例子")

    如果日志 == log2 {
        fmt.Println("同一实例")
    } 别的 {
        fmt.Println("不同的实例")
    }
}

我们的日志已经改变了,现在我们可以看到我们阻止了创建新的例子:

创建新的记录器
2024-07-03T19:45:19.603783Z - 信息:这是日志的例子
已经创建了记录器
2024-07-03T19:45:19.603793Z - 信息:这是日志的另一个例子
同一实例
结论

单例模式是一个强大的工具,可以确保在应用程序运行过程中只有一个特定类别的例子。在记录器示例中,我们了解如何应用该模式,以确保整个应用程序中的日志一致性。

我希望这能帮助你更好地理解 Golang 中的 Singleton。

以上是单例设计模式的详细内容,请关注其他相关文章!


p

最新文章

  • OPPO备份恢复,轻松查找,数据无忧!

  • 单例设计模式-Golang

  • 高效远程协作,Win10桌面一触即达!

  • 品质卓越,力荐这几款顶尖免费虚拟主机!

  • 实现 malloc() 和 free() — 进一步减少堆-C

  • 服务器架构:核心基石,支撑高效运算与存储

  • 云服务器:高效灵活,本地难及;本地受限,云上无界

  • 相关文章

  • 实现 malloc() 和 free() — 进一步减少堆-C

  • 我最近正在开发一种使用方法 go 编写的 cli 最近使用了工具 cobra 工具,我有一个用例,我需要其中一个命令的嵌套提示。我用它 promptui 作为一个提示,没有直接的方法来执行这个操作。本文将展示如何使用promptui。 创建嵌套提示。在这里可以找到完整的代码。

    首先,我们需要创建一个空的Go项目。我们称之为嵌套提示:

    $ mkdir 嵌套提示 && cd 嵌套提示
    $ go mod init <a styl

  • 实现 malloc() 和 free() — 将元数据添加到内存块中-C

  • 整数溢出-C

  • 踏上为期一年的软件工程之旅:从 C 到 Python、JavaScript、Node.js、DevOps 等-C

  • 《王者荣耀》元流之子上线时间介绍-手机游戏策略

  • “最强祖师”升级专业技能道具介绍-手机游戏策略

  • 最强祖师后勤弟子招募策略-手机游戏策略

  • 南宫婉最强祖师的技能强度和玩法策略-手机游戏策略

  • “绝区零”体力使用策略-手机游戏策略

  • 阴阳师禅心云外镜新皮肤获取策略-手机游戏策略

  • 如何抗腐蚀不朽之旅 《不朽之旅》腐化装备保障机制介绍-手机游戏策略