前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Golang语言情怀-第18期 Go 语言设计模式-单利模式

Golang语言情怀-第18期 Go 语言设计模式-单利模式

作者头像
李海彬
发布2021-01-21 17:20:47
4860
发布2021-01-21 17:20:47
举报
文章被收录于专栏:Golang语言社区Golang语言社区

单例模式规定,一个类只能实例化一个实例。因此单例模的特点是:

  1. 只有一个实例
  2. 必须自行创建
  3. 必须自行向系统提供这个实例
应用场景

单例模式的主要使用场景有以下两个方面:

  1. 资源共享情况下避免资源操作导致的性能损耗,比如日志管理器,web网站计数器,应用配置管理对象等
  2. 方便对资源的控制,比如线程池和数据库连接池等

懒汉模式

代码语言:javascript
复制
type singleton struct{}
var ins *singleton
func GetIns() *singleton{
    if ins == nil {
      ins = &singleton{}
    }
    return ins
}

缺点:非协程安全。当正在创建时,有协程来访问此时ins = nil就会再创建,单例类就会有多个实例了。

饿汉模式

代码语言:javascript
复制
type singleton struct{}
var ins *singleton = &singleton{}
func GetIns() *singleton{
     return ins
}

缺点:如果singleton创建初始化比较复杂耗时时,加载时间会延长。

懒汉加锁

代码语言:javascript
复制
type singleton struct{}
var ins *singleton
var mu sync.Mutex
func GetIns() *singleton{
    mu.Lock()
    defer mu.Unlock()
    if ins == nil {
       ins = &singleton{}
    }
    return ins
}

缺点:虽然解决并发的问题,但每次加锁是要付出代价的

双重锁

代码语言:javascript
复制
type singleton struct{}
var ins *singleton
var mu sync.Mutex
func GetIns() *singleton{  
   if ins == nil {
      mu.Lock()
       defer mu.Unlock()
       if ins == nil {
        ins = &singleton{}
       }
    }
    return ins
}

sync.Once实现

代码语言:javascript
复制
type singleton struct{}
var ins *singleton
var once sync.Once
func GetIns() *singleton {
    once.Do(func(){
       ins = &singleton{}
    })
    return ins
}

优点:

  • 在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。
  • 避免对资源的多重占用(比如写文件操作)。

缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。


参考资料:

Go语言单利模式

https://studygolang.com/articles/30897

Golang设计模式-单例模式

https://blog.csdn.net/qq_35703848/article/details/103561987

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言情怀 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 应用场景
  • 懒汉模式
  • 饿汉模式
  • 懒汉加锁
  • 双重锁
  • sync.Once实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档