创建型模式(1):单例模式

116 阅读1分钟

保证一个类只有一个实例,并提供一个访问该实例的全局节点。

type Single struct {}

var Instance *Single

func GetInstance() *Single{
   if Instance == nil{
   	createInstance()
   	return Instance
   }
   return Instance
}

func createInstance(){
   Instance = &Single{}
}

GetInstance 函数返回单例类对象。

单例的构造函数必须对客户端代码隐藏。 调用获取实例方法必须是获取单例对象的唯一方式。

适用场景

  • 如果程序中的某个类对于所有客户端只有一个可用的实例,可以使用单例模式。

优点

  • 可以保证一个类只有一个实例。
  • 获得了一个指向该实例的全局访问节点。
  • 仅在首次请求单例对象时对其进行初始化。

缺点

  • 在多线程环境下需要进行特殊处理,避免多个线程多次创建单例对象。

解决:用sync包的Once结构体控制生成结构体的方式只在第一次执行

import "sync"

var one sync.Once

func getInstance() *Single {
	if Instance == nil {
		one.Do(func() {
			Instance = &Single{}
		})
	}
	return Instance
}