找回密码
 立即注册
首页 业界区 业界 [设计模式]创建型-单例模式

[设计模式]创建型-单例模式

能氐吨 2025-6-9 08:32:48
前言

单例模式是最简单的一种模式。在Go中,单例模式指的是全局只有一个实例,并且它负责创建自己的对象。单例模式有减少内存和系统资源开销、防止多个实例产生冲突等优点。
因为单例模式保证了实例的全局唯一性,并且只被初始化一次,所以比较适合全局共享一个实例,且只需要被初始化一次的场景,例如数据库实例、全局配置、全局任务池等。
单例模式又分为饿汉方式和懒汉方式。饿汉方式是指全局的单例实例在包被加载时创建,而懒汉方式指全局的单例实例在第一次被使用时创建。其中懒汉方式是开源项目中使用最多的方式。
示例代码

Go

懒汉方式的缺点是非并发安全,实际使用中一般加锁,或者使用sync.Once
  1. package singleton  
  2.   
  3. import "sync"  
  4.   
  5. type Singleton interface {  
  6.     foo()  
  7. }  
  8.   
  9. type singleton struct{}  
  10.   
  11. func (s singleton) foo() {}  
  12.   
  13. var (  
  14.     instance *singleton  
  15.     once     sync.Once  
  16. )  
  17.   
  18. func GetInstance() Singleton {  
  19.     once.Do(func() {  
  20.        instance = &singleton{}  
  21.     })  
  22.   
  23.     return instance  
  24. }
复制代码
单元测试
[code]package singleton    import (      "sync"      "testing")    const parCount = 100    func TestSingleton(t *testing.T) {      ins1 := GetInstance()      ins2 := GetInstance()      if ins1 != ins2 {         t.Fatal("instance is not equal")      }  }    func TestParallelSingleton(t *testing.T) {      start := make(chan struct{})      wg := sync.WaitGroup{}      wg.Add(parCount)        instance := [parCount]Singleton{}      for i := 0; i < parCount; i++ {         go func(index int) {
您需要登录后才可以回帖 登录 | 立即注册