单例模式
简而言之:一个类只允许创建一个对象或示例。
饿汉式
项目初始化的时候加载并初始化对象。创建过程线程安全,而且使得问题尽早暴露。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
// @author cold bin
// @date 2023/8/28
package singleton
/*
单例模式的饿汉式:项目编译运行的初期就已经初始化了对象
*/
type Logger interface {
print(...any) error
}
type log struct{}
func (l *log) print(...any) error {
return nil
}
var log_ *log
// 只要导入包,编译时便会初始化这个对象
func init() {
log_ = &log{}
}
func GetInstance() Logger {
return log_
}
|
懒汉式(双重检测)
支持延迟加载,在第一次使用对象的时候创建对象,也就是有需要使用的时候再创建对象。相比懒汉式,支持对象创建的并发安全。代码实现思路:一是通过sync.Mutex
直接加锁;二是使用sync.Once
保证对象创建只调用一次。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
// @author cold bin
// @date 2023/8/28
package singleton
import "sync"
/*
单例模式的懒汉式:支持延迟加载,实现范式会导致频繁加锁和释放锁,而且并发度也低。双重检测版本
*/
var (
log__ *log
once sync.Once
)
func GetLazyInstance() Logger {
if log__ == nil {
once.Do(func() {
log__ = &log{}
})
}
return log__
}
|