前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式:单例模式

设计模式:单例模式

作者头像
运维开发王义杰
发布2023-08-10 14:35:06
1660
发布2023-08-10 14:35:06
举报

单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个访问它的全局访问点。在Go语言中,实现单例模式有多种方式,包括懒汉式、饿汉式、双重检查锁定等。

懒汉式

下面是一个使用懒汉式实现的单例模式的例子:

代码语言:javascript
复制
package singleton


import "sync"


type singleton struct{}


var instance *singleton
var once sync.Once


func GetInstance() *singleton {
    once.Do(func() {
        instance = &singleton{}
    })
    return instance
}

在这个例子中,我们使用了sync.Once来保证只有一个实例被创建。

饿汉式

以下是一个饿汉式的实现,使用go语言:

代码语言:javascript
复制
package main

import (
    "fmt"
)

type Singleton struct{}

var instance *Singleton

func init() {
    instance = &Singleton{}
}

func GetInstance() *Singleton {
    return instance
}

func main() {
    s1 := GetInstance()
    s2 := GetInstance()

    if s1 == s2 {
        fmt.Println("s1 and s2 are the same instance")
    }
}

这个实现中,我们在init函数中初始化了instance变量,保证了在程序运行时,instance变量已经被初始化完成,可以直接使用。在GetInstance函数中,我们直接返回了instance变量的值,保证了每次调用GetI懒汉模式和饿汉模式的区别

这个实现中,我们在init函数中初始化了instance变量,保证了在程序运行时,instance变量已经被初始化完成,可以直接使用。在GetInstance函数中,我们直接返回了instance变量的值,保证了每次调用GetInstance函数时,都返回的是同一个实例。

懒汉模式和饿汉模式的区别

懒汉模式和饿汉模式都是单例模式的实现方式,区别在于:

1. 懒汉模式比较懒,只有当调用getInstance的时候,才回去初始化这个单例。

2. 饿汉模式就是类一旦加载,就把单例初始化完成,保证getInstance的时候,单例是已经存在的了。

双重检查锁定

在Go语言中实现双重检查锁定,可以使用如下代码:

代码语言:javascript
复制
package main


import (
    "sync"
)


type Singleton struct{}


var instance *Singleton
var once sync.Once


func GetInstance() *Singleton {
    if instance == nil {
        once.Do(func() {
            instance = &Singleton{}
        })
    }
    return instance
}


func main() {
    s1 := GetInstance()
    s2 := GetInstance()


    if s1 == s2 {
        fmt.Println("s1 and s2 are the same instance")
    }
}

在这个实现中,我们使用了sync包中的Once类型,保证了instance变量只会被初始化一次。在GetInstance函数中,我们首先检查instance变量是否已经被初始化,如果没有被初始化,则调用once.Do函数来初始化instance变量。once.Do函数是一个原子操作,保证了instance变量只会被初始化一次。

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

本文分享自 运维开发王义杰 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档