Skip to content
← 返回设计模式列表
设计意图与对象责任

单例 ​

保证一个类型只有一个共享实例。

创建型

说明 ​

适合需要全局共享且初始化成本高的状态;并发环境使用 sync.Once,避免普通全局变量的初始化竞争。

分析 ​

调用方始终通过同一个入口取得实例,因此不必自己协调对象的创建与复用。示例用 sync.Once 保证多个 goroutine 同时调用时只初始化一次。

Once.Do 协调初始化与发布:并发调用会等待初始化函数完成后取得同一个指针。它不保护返回后的 Config.Name 写入;如允许动态更新,仍需锁或不可变快照。共享范围是这个进程中的这份变量,并不是跨进程唯一配置中心,测试隔离也会受到全局状态影响。

查看图表代码

适用前提与边界 ​

单例会引入共享状态,测试时尤其要避免让不同用例相互影响。 创建过程没有复用或选择需求时,直接构造通常更清楚。

示例输入与调用 ​

go
fmt.Println(GetConfig().Name)

运行输出 ​

text
app

完整 Go 示例 ​

go
package main

import (
	"fmt"
	"sync"
)

var instance *Config
var once sync.Once

type Config struct{ Name string }

func GetConfig() *Config {
	once.Do(func() { instance = &Config{Name: "app"} })
	return instance
}

func main() {
	fmt.Println(GetConfig().Name)
}

继续阅读