基本概念

简单来说就是保证一个类仅有一个实例,并提供一个访问它的全局访问点

注意点

1. 某个类只能有一个实例

2. 这个类必须自行创建这个实例

3. 这个类必须自行向整个系统提供这个实例

分类

单例模式主要分为饿汉式跟懒汉式写法

1. 饿汉式:类在编译时创建自己的实例。由于是静态初始化,它是类一加载就实例化的对象,所以会占用资源。简单理解就是实例已经提前创建好了,GetInstance()只是获取实例返回。

2. 懒汉式:类在运行时创建自己的实例。由于是在运行时才创建自己实例,会面临多线程访问的安全问题,需要处理才能保证安全。

代码实例

饿汉式单例模式

func init() {s = &singleton{}
}var s *singletontype singleton struct {
}func GetInstance() *singleton {return s
}func main() {a1 := GetInstance()a2 := GetInstance()fmt.Println(a1 == a2) //结果为true
}

懒汉式单例模式

普通情况下的单例模式

var s *singletontype singleton struct {}func GetInstance() *singleton {if s == nil{s = &singleton{}}return s
}func main()  {a1 := GetInstance()a2 := GetInstance()fmt.Println(a1 == a2) //结果为true
}

并发情况下的单例模式

例1:

var (s *singletonlock = &sync.Mutex{}
)type singleton struct {
}func GetInstance() *singleton {lock.Lock()defer lock.Unlock()if s == nil {s = &singleton{}}return s
}

例2:

例1的改进版,第一个if是先判断实例是否存在再进行处理,避免每次调用函数就进行处理,影响性能。第二个if是为了应付并发的情况。

var (s    *singletonlock = &sync.Mutex{}
)type singleton struct {
}func GetInstance() *singleton {if s == nil {lock.Lock()defer lock.Unlock()if s == nil {s = &singleton{}}}return s
}

例3:

优雅的方式,使用Go独特的机制sync.Once,保证实例化代码只会执行一次

var (s    *singletononce = &sync.Once{}
)type singleton struct {
}func GetInstance() *singleton {once.Do(func() {s = &singleton{}})return s
}

注意:上面在定义singleton这个结构体时都是用小写字母开头,是避免它被其它地方调用,在go语言中,大写字母开头的写法类似于公共变量。

Go语言实现单例模式相关推荐

  1. C语言设计模式-单例模式

    单例模式 1.概念 1.1 单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象.也就是说,在整个程序空间中,该类只存在一个实例对象.1.2 从结构图中可以知道,有一个叫做 ...

  2. C语言:单例模式(懒汉式)

    引言 上篇<C语言:单例模式(饿汉式)>,我们介绍了单例的饿汉式实现,本文将向大家继续介绍单例的懒汉式实现方式. 懒汉式 懒汉式,本意就是说这种实现像懒汉一样,不到紧要关头绝不创建对象.常 ...

  3. C语言实现单例模式,以及使用内存屏障的性能优化方案

    这里有一篇关于<C语言实现简单的单例模式>的基于OpenMP多线程的单例模式示例程序,这里给出采用内存屏障由于单例模式的示例"https://coderatwork.cn/pos ...

  4. c语言静态变量instance,C语言之单例模式

    #include #include #include #include typedef struct _Person{ char name[20] ; int age ; }Person ; //ty ...

  5. C语言实现简单的单例模式

    单例模式就是在程序运行过程中只存在此"对象"的一个"实例",C语言实现单例模式就是简单的运用static全局变量. 我们的学号在教务系统中无论在任何地点进行任何 ...

  6. 我向面试官讲解了单例模式,他对我竖起了大拇指

    作者:小菠萝 单例模式相信大家都有所听闻,甚至也写过不少了,在面试中也是考得最多的其中一个设计模式,面试官常常会要求写出两种类型的单例模式并且解释其原理,废话不多说,我们开始学习如何很好地回答这一道面 ...

  7. java单例模式代码vol_单例模式--java代码实现

    单例模式 单例模式,顾名思义,在程序运行中,实例化某个类时只实例化一次,即只有一个实例对象存在.例如在古代,一个国家只能有一个皇帝,在现代则是主席或总统等. 在Java语言中单例模式有以下实现方式 1 ...

  8. python中的单例模式_Python单例模式

    Singleton(单例) -- 对象创建型模式 在GoF的<设计模式:可复用面向对象软件的基础>如下定义: 意图 保证一个类仅有一个实例,并且提供一个访问它的全局访问点. 适用性 在下面 ...

  9. 学妹问单例模式,我用最通俗易懂的讲解让她学会了

    前记 昨天学妹抱怨专业课中的java 23个设计模式.她问:23个设计模式越看越扎心,尤其是单例模式,有没有什么破解之法.我告诉她 java 23个设计模式看上去多,要挑知识重点并结合程序实例来记忆, ...

最新文章

  1. 有关高级关系引擎中存在错误
  2. python基础教程3-Python基础教程(三)
  3. python自动化办公兼职-python如何实现自动化办公?
  4. 利用FRIDA攻击Android应用程序(二)
  5. Java原生API操作XML
  6. Mybatis plus 开启日志
  7. HDU 5157(回文树)
  8. 零基础程序员如何花 8 个月时间获得特斯拉实习机会?
  9. 图文演示通过虚拟打印机生成pdf的使用技巧
  10. AI笔刷:600+专业ai笔刷套装
  11. linux pkg文件,pkg文件结构详细解释(转)
  12. 如何在VSCode设置/取消隐藏文件
  13. 【冰糖R语言】Pearson、Spearman相关性及其显著性 cor() rcorr()
  14. 【淘宝API开发系列】获得商品评论 API 返回值说明
  15. Kalman滤波器从原理到实现
  16. 陈天桥染指手机传言再起 数位红担当重任
  17. jQuery动画操作
  18. python cerberus Validator参数校验
  19. 台湾内存厂商进军NAND市场未果,时机已过仅当利基玩家?
  20. String字符串删除空格的七种方式

热门文章

  1. redis入门及其集群搭建、哨兵模式
  2. Dev-Cpp下载与安装(图文教程)
  3. 性能测试常见问题及瓶颈判断分析
  4. ffmpeg视频格式解读
  5. CVPR2023 | SparseViT:一种有效处理高分辨率图像的Transformer
  6. Win7用户文件夹默认位置修改
  7. ubuntu2022预科(一)------cron配置
  8. 新形势下的工业MRO电商平台该何去何从?
  9. python自动化[poco篇]
  10. powell法c/c++程序