【设计模式】1、单例模式

文章目录

单例分为, 执行时机分为: 饿汉, 懒汉两种

  • 饿汉: 进程启动时执行, 优点是更容易暴露问题, 缺点是进程启动时会执行太多耗时操作
  • 懒汉: 使用时执行, 优点是把耗时操作分散到进程使用的过程中, 缺点是问题会被延迟暴露, 不易于定位问题

在 go 中可以通过 sync.Once 实现

go 复制代码
package singleton

import "sync"

// 变量实例
var (
    once sync.Once
    cli  *client
)

// 类型, 构造函数
type client struct{}

func newClient() *client {
    return &client{}
}

// InitClient
// 1. 可在 package 的 init() 函数中, 被自动调用, 是饿汉
// 2. 也可在进程初始化时, 被手动调用, 是饿汉
// 3. 在使用时才调用, 是懒汉
func InitClient() *client {
    once.Do(func() {
       cli = newClient()
    })
    return cli
}

单测:

go 复制代码
package singleton

import (
    "github.com/stretchr/testify/require"
    "testing"
)

func TestInitClient(t *testing.T) {
    cli1 := InitClient()
    cli2 := InitClient()
    require.Equalf(t, cli1, cli2, "单例, 构造的指针应相同")
}

func BenchmarkInitClient(b *testing.B) {
    b.RunParallel(func(pb *testing.PB) {
       for pb.Next() {
          cli1 := InitClient()
          cli2 := InitClient()
          require.Equalf(b, cli1, cli2, "单例, 构造的指针应相同")
       }
    })
}

执行:

Bash 复制代码
go test .
go test -bench .
相关推荐
bryant_meng15 小时前
【Codex】Part 19 — Codex Prompt Design Patterns
设计模式·prompt·playbook·结果优先·用证据定义完成
AI人工智能+电脑小能手16 小时前
大白话说Java设计模式-38-迭代器模式(业务实战篇)
java·设计模式·迭代器模式·stream·遍历封装·集合通用·分页遍历
qyyyyy57018 小时前
芯片 Application Note PDF 怎么读?参考电路、BOM 和调试波形翻译实战
嵌入式硬件·设计模式·机器翻译·web application
程序员贺加贝21 小时前
列表导出不够用-SaaS-ERP-单据详情导出的-Provider-模板与文档型-Excel-设计
java·后端·设计模式·架构·excel
AI人工智能+电脑小能手2 天前
大白话说Java设计模式-34-命令模式(业务实战篇)
java·spring·设计模式·命令模式·异步任务·撤销重做·事务封装
用户202252215062 天前
字节发布"豆包工作",我从AI PM角度看到的不是功能,是上下文
设计模式
AI人工智能+电脑小能手2 天前
大白话说Java设计模式-37-中介者模式(源码剖析篇)
java·设计模式·线程池·中介者模式·源码分析·executor·applicationeventmulticaster
电子科技圈2 天前
IAR与东软睿驰达成战略合作,强化软件开发效率与生态协作
设计模式·开源·软件工程·软件构建·代码规范·设计规范·代码复审
吴声子夜歌2 天前
Java面试——设计模式(四)
java·设计模式·面试
吴声子夜歌3 天前
Java面试——设计模式(一)
java·设计模式·面试