元素码农
基础
UML建模
数据结构
算法
设计模式
网络
TCP/IP协议
HTTPS安全机制
WebSocket实时通信
数据库
sqlite
postgresql
clickhouse
后端
rust
go
java
php
mysql
redis
mongodb
etcd
nats
zincsearch
前端
浏览器
javascript
typescript
vue3
react
游戏
unity
unreal
C++
C#
Lua
App
android
ios
flutter
react-native
安全
Web安全
测试
软件测试
自动化测试 - Playwright
人工智能
Python
langChain
langGraph
运维
linux
docker
工具
git
svn
🌞
🌙
目录
▶
设计原则
单一职责原则
开闭原则
里氏替换原则
依赖倒置原则
接口隔离原则
迪米特法则
▶
创建型模式
工厂方法模式
抽象工厂
单例模式
建造者模式
原型模式
▶
结构型模式
适配器模式
装饰器模式
代理模式
外观模式
组合模式
桥接模式
享元模式
▶
行为型模式
策略模式
观察者模式
命令模式
模板方法模式
状态模式
责任链模式
迭代器模式
中介者模式
访问者模式
备忘录模式
解释器模式
发布时间:
2025-03-21 10:57
↑
☰
# 单例模式 ## 定义 单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。单例模式是最简单的设计模式之一,但在实现时需要注意线程安全问题。 ## 适用场景 - 需要控制资源的共享访问,如数据库连接池 - 需要节省系统资源的对象,如配置管理器 - 需要全局状态管理的场景,如日志记录器 - 需要协调系统行为的场景,如任务调度器 ## 结构图 ```mermaid classDiagram class Singleton { -instance *Singleton -Singleton() +GetInstance() *Singleton +BusinessLogic() } note for Singleton "确保只有一个实例" ``` ## 实现方式 ### 1. 懒汉式(延迟加载) ```go package singleton import "sync" type singleton struct {} var ( instance *singleton mu sync.Mutex ) // 双重检查锁定(Double-Check Locking) func GetInstance() *singleton { if instance == nil { mu.Lock() defer mu.Unlock() if instance == nil { instance = &singleton{} } } return instance } ``` ### 2. sync.Once实现(推荐) ```go package singleton import "sync" type singleton struct {} var ( instance *singleton once sync.Once ) // 使用sync.Once保证只执行一次 func GetInstance() *singleton { once.Do(func() { instance = &singleton{} }) return instance } ``` ### 3. 饿汉式(初始化即创建) ```go package singleton type singleton struct {} var instance = &singleton{} func GetInstance() *singleton { return instance } ``` ## Go语言最佳实践 1. **优先使用sync.Once** - Go语言标准库提供的sync.Once是实现单例最优雅的方式 - 保证线程安全且性能优秀 2. **包级别变量** - 利用Go语言包级别变量的特性实现单例 - 包初始化时自动创建实例 3. **接口设计** ```go package singleton type Singleton interface { DoSomething() } type singleton struct{} var ( instance Singleton once sync.Once ) func GetInstance() Singleton { once.Do(func() { instance = &singleton{} }) return instance } ``` ## 优缺点分析 ### 优点 - 保证一个类只有一个实例,严格控制访问 - 延迟初始化,提高性能 - 避免资源浪费 - 提供全局访问点 ### 缺点 - 违反单一职责原则,一个类承担了两个职责 - 可能掩盖不良设计,如全局状态管理不当 - 单元测试困难,因为无法轻易模拟 - 并发环境下需要特别注意实现方式 ## 使用建议 1. **合理使用** - 确实需要全局唯一实例时才使用 - 避免用单例管理可变状态 2. **线程安全** - Go中优先使用sync.Once - 避免使用双重检查锁定 3. **测试友好** - 考虑使用依赖注入 - 设计时预留测试扩展点 4. **初始化时机** - 根据需求选择懒汉式或饿汉式 - 考虑启动性能和资源占用