单例模式(Singleton Pattern)

463 阅读2分钟

简述

单例模式(Singleton Pattern)是最简单的设计模式之一。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

应用

通常应用于共享的实例,比如线程池、全局缓存、对象池等。

实现

  • 限制调用者直接实例化对象,对于java的做法是将构建函数设置为private,在go语言上面没有构建方法,通过利用package的访问规则来实现,定义struct的名字为小写字母开头,仅限本package内可以访问。
  • 为该对象的单例提供一个全局唯一的访问方法,对于java的做法是定义通过static修饰的创建实例的方法供调用,在go语言上面同样也是利用package的访问规则来实现,定义首字母大写的函数供外部调用创建实例

示例

定义单例模式 struct

非线程安全

package singleton

// 定义只有当前包可以访问的 struct
type singletonPattern struct {
   msg string
}

// 对struct对象进行实例化
var patten = &singletonPattern{msg: "单例模式"}

// 对外暴露实例化的构造函数
func Instance() *singletonPattern {
   return patten
}

// 提供相关的访问方法
func (s *singletonPattern) GetMsg() string {
   return patten.msg
}

线程安全

package singleton

import "sync"

// 定义只有当前包可以访问的 struct
type singletonPattern struct {
   msg string
}

// 定义全局struct对象
var patten *singletonPattern
//  Go 标准库提供的使函数只执行一次的实现,常应用于单例模式,例如初始化配置、保持数据库连接等
var once = sync.Once{}

// 对外暴露实例化的构造函数
func Instance() *singletonPattern {
   once.Do(func() {
      patten = &singletonPattern{msg: "单例模式"}
   })
   return patten
}

// 提供相关的访问方法
func (s *singletonPattern) GetMsg() string {
   return patten.msg
}

引用单例模式

package main

import "github.com/design/pattern/singleton"

func main() {
   singleton.Instance().GetMsg()
}