Golang设计模式之-单例模式

单例模式(Singleton Pattern)是一种确保一个类只有一个实例,并提供一个全局访问点来获取该实例的设计模式。在Go中实现单例模式时,通常会涉及到饿汉模式和懒汉模式

饿汉模式

package singleton

type singleton struct{}

var instance = &singleton{}

func GetInstance() *singleton {
	return instance
}

在这个饿汉模式的例子中,instance 是一个包级私有变量,它在包被导入时立即初始化。GetInstance 函数提供了访问这个单例实例的全局访问点

懒汉模式

package singleton

type singleton struct{}

var instance *singleton

// 懒汉模式
func GetInstance() *singleton {
	if instance == nil {
		instance = &singleton{}
	}
	return instance
}

相较于饿汉式的实现,我们把实例化 singleton 结构体部分的代码移到了 GetInstance() 函数内部。这样一来,就将对象实例化的步骤延迟到了 GetInstance() 被第一次调用时。但是通过 instance == nil 的判断来实现单例并不十分可靠,当有多个 goroutine 同时调用 GetSingleton() 时无法保证并发安全。

支持并发的单例

package singleton

import "sync"

type singleton struct{}

var instance *singleton

var once sync.Once

// 懒汉模式
func GetInstance() *singleton {
	once.Do(func() {
		instance = &singleton{}
	})
	return instance
}

在这个懒汉模式的例子中,instance 变量在第一次调用 GetInstance 函数时才被初始化。sync.OnceDo 方法确保了初始化代码只会执行一次,即使在多线程环境中也是安全的