单例模式(Go)

单例模式是23种面向对象的设计模式之一。在实际应用中,涉及到配置或资源管理的对象,都应该考虑单例模式。广义上讲,只要能够保证只执行一次类的实例化过程,就能实现单例模式。如果某段代码确实只会执行一次,那么就是一个天然的单例模式,比如python里的模块导入。而有的时候,初始化对象的函数可能要执行多次,这时就需要对类的实例化进行拦截。单例模式最基本的问题,是判断是否类已经实例化,这就需要用一个变量,来判断,比如锁,全局变量,类变量(Python), 闭包(Python)等等。

type singleton struct {}
var single *singleton

1.最简单的单例模式

// 非线程安全的单例模式
func GetInstance1() *singleton {
    if single == nil {
        single = &singleton{}
    }
    return single
}

2.线程安全的单例模式

// 线程安全的单例模式
import "sync"
var lock sync.Mutex

func GetInstance2() *singleton {
    lock.Lock()
    defer lock.Unlock()
    if single == nil {
        single = &singleton{}
    }
    return single
}

3.优化的线程安全单例模式

// 线程安全的单例模式,且降低锁的开销
func GetInstance3() *singleton {
    if single == nil {
        lock.Lock()
        defer lock.Unlock()
        if single == nil {
            single = &singleton{}
        }
    }
    return single
}

4. 使用sync.Once

// 使用sync.Once, 代码最优雅
var once sync.Once
func GetInstance3() *singleton {
    once.Do(func(){
        single = &singleton{}
    })
    return single
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容