设计模式--单例模式(Go语言描述)

设计模式–单例模式(Go语言描述)

介绍

“单例模式,也叫单子模式,是一种常用的软件设计模式。 在应用这个模式时,单例对象的类必须保证只有一个实例存在。 许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。” –维基百科

示例

在大多数面向对象的编程语言中,单例模式的使用通常需要注意以下几点:

  1. 单例类的构造函数需要定义为私有函数,以避免类外调用导致单例类出现多个实例。
  2. 创建一个静态的私有成员,单例类对象作为私有成员与类绑定而不是与对象绑定。
  3. 对外提供一个公有的静态方法,该方法需要实现的功能是,判断单例类对象是否已经初始化,如果没有初始化则执行私有的构造函数,最后返回单例类实例。

在Go语言中,单例模式的实现较为简单,sync包的sync.Once结构体的Do方法可以保证传入的函数仅可被调用一次,不需要额外考虑复杂的并发情况(饿汉懒汉双重检验锁)。
以配置文件为例,在整个系统中通常只需要一个实例去读取配置文件,系统中的模块通过配置文件类的全局实例去获取配置文件中所需要的参数。

package main

import (
    "fmt"
    "sync"
)

type Config struct{}

var once sync.Once
var configInstance *Config

func GetConfigInstance() *Config {
    // configInstance只可以被初始化一次
    once.Do(func() {
        fmt.Printf("Init Config\n")
        configInstance = &Config{}
    })
    fmt.Printf("Return Config Instance\n")
    return configInstance
}

func main() {
    for i := 0; i < 5; i++ {
        GetConfigInstance()
        fmt.Printf("\n")
    }
}

/* 执行结果
Init Config
Return Config Instance

Return Config Instance

Return Config Instance

Return Config Instance

Return Config Instance

*/

通过查看终端的打印信息,我们可以发现Init Config语句只被调用了一次,也就是once.Do中的Config初始化函数只执行了一次。

参考:

本文使用CC BY-NA-SA 4.0协议许可
本文链接:http://404-notfound.com/Singleton/