[go] 单例模式

简介: [go] 单例模式

单例模式


确保类只有一个实例,并提供一个全局的访问点。


模型说明


  • 单例(Singleton)类声明了一个名为getInstance的方法来返回其所属类的一个相同实例。


  • 单例的构造函数必须对客户端的代码隐藏。调用getInstance方法必须是获取单例对象的唯一方式。


优缺点


1.优点

  • 你可以肯定,一个类只有一个实例。
  • 有助于获得该实例的全局访问点。
  • 仅在首次请求单例对象时对其进行初始化。


2.缺点

  • 它违反了单一责任原则。该模式同时解决了两个问题。
  • 保证一个类只有一个实例
  • 为该实例提供一个全局访问节点
  • 单例模式可以掩盖糟糕的设计。例如,当程序组件对彼此了解太多。
  • 不是线程安全的,你写的代码要确保为所有线程只创建一个实例。
  • 单例的客户端代码单元测试可能会比较困难, 因为许多测试框架以基于继承的方式创建模拟对象。 由于单例类的构造函数是私有的, 而且绝大部分语言无法重写静态方法, 所以你需要想出仔细考虑模拟单例的方法。 要么干脆不编写测试代码, 或者不使用单例模式。


使用场景


  • 如果程序中的某个类对于所有客户端只有一个可用的实例, 可以使用单例模式。
  • 如果你需要更加严格地控制全局变量, 可以使用单例模式。


参考代码


这里我们分两个例子吧,一个是简单的单例实现,另外一个是解决异步情况可能会出现的问题


sample


type single struct{}
var normalSingleInstance *single
func getNormalSingle() *single {
  if normalSingleInstance == nil {
    fmt.Println("creating single instance")
    normalSingleInstance = new(single)
  } else {
    fmt.Println("single instance already created")
  }
  return normalSingleInstance
}
func main() {
  for i := 0; i < 10; i++ {
    getNormalSingle()
  }
}


输出:


creating single instance
single instance already created
single instance already created
single instance already created
single instance already created
single instance already created
single instance already created
single instance already created
single instance already created
single instance already created

multithread

type single struct{}
var lock = &sync.Mutex{}
var multiThreadSafeInstance *single
func getMultiThreadSafeInstance() *single {
  if multiThreadSafeInstance == nil {
    lock.Lock()
    defer lock.Unlock()
    if multiThreadSafeInstance == nil {
      fmt.Println("creating multi-thread safe instance now.")
      multiThreadSafeInstance = new(single)
    } else {
      fmt.Println("multi-thread safe instance already created.")
    }
  } else {
    fmt.Println("multi-thread safe instance already created.")
  }
  return multiThreadSafeInstance
}
func main() {
  for i := 0; i < 2; i++ {
    go func() {
      for j := 0; j < 5; j++ {
        getMultiThreadSafeInstance()
      }
    }()
  }
  select {}
}


输出:


creating multi-thread safe instance now. 
multi-thread safe instance already created. 
multi-thread safe instance already created. 
multi-thread safe instance already created. 
multi-thread safe instance already created. 
multi-thread safe instance already created. 
multi-thread safe instance already created. 
multi-thread safe instance already created. 
multi-thread safe instance already created. 
multi-thread safe instance already created.
相关文章
|
3月前
|
设计模式 Java Go
什么是Go 中的单例模式?
本文介绍了Go语言中的单例设计模式,包括饿汉式与懒汉式两种实现方式。饿汉式单例在程序启动时即完成实例化,适用于不需延迟加载的情况;通过全局变量初始化确保实例唯一性。懒汉式单例采用延迟初始化策略,在首次请求时创建实例,适合资源消耗较大的场景;利用双重检查锁定机制保证多线程环境下的安全性。两种模式各有优劣,开发者应根据实际需求选择合适的实现方案。
|
4月前
|
设计模式 安全 Java
聊聊 Go 中的单例模式
**摘要:** 单例模式确保类只有一个实例,提供全局访问点。Go中实现单例有饿汉式和懒汉式。饿汉式在程序启动时创建实例,如: ```go var Instance = new(singleton) ``` 懒汉式首次需要时创建,使用双重检查锁定模式确保线程安全: ```go if instance == nil { mutex.Lock() if instance == nil { instance = new(singleton) } mutex.Unlock() } ``` 饿汉式简单但可能浪费资源,懒汉式延迟初始化但需处理并发。
52 0
|
5月前
|
Go
go之单例模式
go之单例模式
|
6月前
|
设计模式 安全 测试技术
[设计模式 Go实现] 创建型~单例模式
[设计模式 Go实现] 创建型~单例模式
|
设计模式 存储 缓存
Go 语言实现创建型设计模式 - 单例模式
Go 语言实现创建型设计模式 - 单例模式
68 1
|
设计模式 Java Go
Go实现设计模式之单例模式
单例模式(Singleton Pattern)是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点。单例模式常用于需要共享资源或控制资源访问的场景,例如数据库连接池、线程池等。
275 0
|
存储 设计模式 安全
一起学习 Go 语言设计模式之单例模式(上)
单例模式很容易记住。就像名称一样,它只能提供对象的单一实例,保证一个类只有一个实例,并提供一个全局访问该实例的方法。
一起学习 Go 语言设计模式之单例模式(上)
|
设计模式 缓存 网络协议
Go设计模式(6)-单例模式
前面5篇文章讲解了设计模式的语法、面向对象分析、原则、代码编写、类图表示法,从本文开始讲述23种设计模式。
|
设计模式 缓存 Java
一起学习 Go 语言设计模式之单例模式(下)
单例模式很容易记住。就像名称一样,它只能提供对象的单一实例,保证一个类只有一个实例,并提供一个全局访问该实例的方法。