单例模式

img

简而言之:一个类只允许创建一个对象或示例。

饿汉式

项目初始化的时候加载并初始化对象。创建过程线程安全,而且使得问题尽早暴露。

 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__
}