Skip to main content
  1. internet/

设计模式之单例模式

·356 words·1 min·

单例模式是确保对象只初始化一次的编码模式,常用于全局资源的创建。

实现单例模式 #

在其他语言(如java)中,可能需要双重锁检查的方式来实现单例模式,但是在go中直接使用sync.Once即可:

package singleton

import "sync"

var (
	once           sync.Once
	globalResource *resource
)

type resource struct {}

func GetResource() *resource {
	once.Do(func() {
		globalResource = new(resource)
	})
	return globalResource
}

避免使用单例模式 #

单例模式最需要人们关心的其实并不是如何实现,而是如何避免使用。

在《游戏编程模式》中总结了如下理由:

  1. **单例模式所创建的对象可以看做是全局变量,而全局变量增加了代码的复杂度。**假如我们在查bug,我们理应只需关注这个方法内的逻辑,而不应把精力花费在全局变量上。
  2. **全局变量造成了耦合。**由于任何地方都能进行引用,那么开发者就会在一切地方引用。所以这块代码将难以维护——因为没人能修改全局的代码并且确保它不会出错。
  3. **对并发不友好。**这显而易见。