目的:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
主要解决:一个全局使用的对象频繁地创建与销毁。
何时使用:需要控制实例数目,节省系统资源的时候。
如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
优点:
- 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例
- 2、避免对资源的多重占用(比如写文件操作)。
使用场景:
- 1、计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。
- 2、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接、日志对象、线程池等。
Go语言实现
//保证仅有一个实例,并提供一个访问它的全局访
//不对外访问
type singleton struct {
data int
}
var sin *singleton
var once sync.Once
// GetSingleton 获取实例对象函数
//生成一个全局唯一对象
func GetSingleton() *singleton {
once.Do(func() {
sin = &singleton{12}
})
fmt.Println("实例对象的信息和地址", sin, &sin)
return sin
}