【设计模式】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 .
相关推荐
willow6 小时前
Axios由浅入深
设计模式·axios
七月丶2 天前
别再手动凑 PR 了:这个 AI Skill 会按仓库习惯自动建分支、拆提交、提 PR
人工智能·设计模式·程序员
刀法如飞2 天前
从程序员到架构师:6大编程范式全解析与实践对比
设计模式·系统架构·编程范式
九狼2 天前
Flutter + Riverpod +MVI 架构下的现代状态管理
设计模式
静水流深_沧海一粟3 天前
04 | 别再写几十个参数的构造函数了——建造者模式
设计模式
StarkCoder3 天前
从UIKit到SwiftUI的迁移感悟:数据驱动的革命
设计模式
阿星AI工作室3 天前
给openclaw龙虾造了间像素办公室!实时看它写代码、摸鱼、修bug、写日报,太可爱了吧!
前端·人工智能·设计模式
_哆啦A梦4 天前
Vibe Coding 全栈专业名词清单|设计模式·基础篇(创建型+结构型核心名词)
前端·设计模式·vibecoding
阿闽ooo7 天前
中介者模式打造多人聊天室系统
c++·设计模式·中介者模式