单例设计模式:

wiki百科: 单例模式,也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。

注意:

  • 1、单例类只能有一个实例。
  • 2、单例类必须自己创建自己的唯一实例。
  • 3、单例类必须给所有其他对象提供这一实例。

意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

主要解决:一个全局使用的类频繁地创建与销毁。

何时使用:当您想控制实例数目,节省系统资源的时候。

如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。

懒汉模式:

type SingleObject struct {
	Count int
}

var singleObj *SingleObject

func GetInstance1() *SingleObject {
	if singleObj == nil {
		singleObj = new(SingleObject)
	}
	return singleObj
}
instancenil

测试代码:

func testSingleton() {
	s1 := SingletonPattern.GetInstance1()
	s1.Count = 5
	fmt.Println(s1)
	s2 := SingletonPattern.GetInstance1()
	fmt.Println(s2)
}

 饿汉模式:

var singleObj *SingleObject
func init() {
	singleObj = new(SingleObject)
}

func GetInstance2() *SingleObject {
	return singleObj
}

饿汉模式将在包加载的时候就创建单例对象,当程序中用不到该对象时,浪费了一部分空间

和懒汉模式相比,更安全,但是会减慢程序启动速度,所以我们可以在进一步修改程序

双重检查机制:

var lock *sync.Mutex = &sync.Mutex{}
func GetInstance3() *SingleObject {
	if singleObj == nil {
		lock.Lock()
		defer lock.Unlock()
		singleObj = new(SingleObject)
	}
	return singleObj
}

不过对于单例模式来说Golang在标准包中已经有了更好的解决方法Sync.Once: