温馨提示:这篇文章已超过476天没有更新,请注意相关的内容是否还可用!
摘要:单例模式是一种常用的设计模式,用于确保某个类只有一个实例,并提供一个全局访问点。它适用于需要频繁访问或操作唯一对象的情况,如配置类、数据库连接等。单例模式通过限制实例化次数来节省系统资源并提高性能。其核心思想是在程序运行期间只创建一个对象实例,并通过全局访问点进行访问,确保系统范围内只有一个实例存在。
概述
单例模式分为饿汉式和懒汉式两种执行时机。
单例模式介绍
1、饿汉式:进程启动时执行,优点是更容易暴露问题,缺点是在进程启动时执行太多耗时操作可能会影响性能。
2、懒汉式:使用时执行,优点是把耗时操作分散到进程使用的过程中,缺点是问题可能会被延迟暴露,不易于定位问题。
Go语言实现单例模式
在Go中,可以通过sync.Once实现单例模式,示例代码如下:
package singleton import "sync" // 变量实例 var ( once sync.Once cli *client ) // 类型和构造函数 type client struct{} func newClient() *client { return &client{} } // InitClient函数实现单例模式 // 可以在package的init()函数中自动调用,属于饿汉式 // 也可以在进程初始化时手动调用,属于饿汉式 // 也可以在使用时才调用,属于懒汉式 func InitClient() *client { once.Do(func() { cli = newClient() }) return cli }
单元测试
为了确保单例模式的正确性,我们可以进行单元测试,示例代码如下:
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, "单例模式,构造的指针应相同") // 断言两个指针是否相同,以确保单例模式的正确性。 } }) } // 执行单元测试 go test . // 执行性能测试 go test -bench . 五、单例模式是一种常见的设计模式,用于限制某个类只能创建一个实例,在Go语言中,可以通过sync.Once实现单例模式,通过单元测试可以确保单例模式的正确性,在实际应用中,可以根据需求选择饿汉式或懒汉式的执行时机。
文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。
还没有评论,来说两句吧...