go语言设计模式-单例模式

建造型设计模式-单例模式

是用来控制类型实例的数量的,当需要确保一个类型只有一个实例时,就需要使用单例模式。

即把实例的访问进行收口,不能谁都能 new 类,所以单例模式还会提供一个2访问该实例的全局端口,一般都会命名个 GetInstance之类的函数用作实例访问的端口。

由创造但单例的时间,单例模式分为饿汉模式懒汉模式

饿汉模式

饿汉模式适用于系统初始化时创建已经确定的类型实例,如数据库实例。

使用go语言的init函数实现。

go 复制代码
package dao
// 饿汉式单例
// 注意定义非导出类型
type  databaseConn struct{
  ...
}

var dbConn *databaseConn

func init() {
  dbConn = &databaseConn{}
}

// GetInstance 获取实例
func Db() *databaseConn {
 return dbConn
}

懒汉模式

懒汉模式是延迟加载的模式,适合程序执行过程中条件成立才创建加载的类型实例。

要考虑并发环境下,判断实例是否已经创建时,是不是用的当前读。

在go语言中采用原子操作atomic.Loadatomic.Store去读写这个状态变量

go 复制代码
import "sync"
import "sync/atomic"

var initialized uint32

type singleton struct {
  ...
}

func GetInstance() *singleton {

    if atomic.LoadUInt32(&initialized) == 1 {  // 原子操作 
      return instance
   }

    mu.Lock()
    defer mu.Unlock()

    if initialized == 0 {
         instance = &singleton{}
         atomic.StoreUint32(&initialized, 1)
    }

    return instance
}
相关推荐
JCGKS20 分钟前
Go| excelize的流式迭代器
后端·golang·excel·excelize·流式读取·文件解析
帅中的小灰灰21 分钟前
C++编程建造器设计模式
java·c++·设计模式
ZHE|张恒23 分钟前
设计模式(十)外观模式 — 提供统一入口,简化复杂系统的使用
设计模式·外观模式
howcode4 小时前
女友去玩,竟带回一道 “虐哭程序员” 的难题
后端·设计模式·程序员
自学AI的鲨鱼儿9 小时前
cursor 使用 gvm管理的go的环境出现 Failed to find the “go“ binary in either GOROOT() 错误
golang·cursor·gvm
席万里9 小时前
Go开源库gcurl实际生产级应用
开发语言·后端·golang
ChineHe13 小时前
Golang并发编程篇002_Go并发基础
开发语言·后端·golang
apigfly1 天前
深入Android系统(十三)Android的窗口系统
android·设计模式·源码
麻辣兔变形记1 天前
基于 Go‑Zero 的用户 CRUD Demo:如何一步步从 MySQL + sqlx 演进为 PostgreSQL + GORM + 微服务架构
mysql·微服务·postgresql·架构·golang
i***27951 天前
【golang学习之旅】使用VScode安装配置Go开发环境
vscode·学习·golang