单例模式恐怕是最为人熟知的一种设计模式了。它同样也是创建型模式的一种。当某个struct只允许有一个实例的时候,我们会用到这种设计模式。这个struct的唯一的实例被称为单例对象。下面是需要创建单例对象的一些场景:
- 数据库实例:一般在开发中,对于一个应用,我们通常只需要一个数据库对象实例
- 日志实例:同样,对于一个应用来说,日志操作对象也只需要一个实例
单例对象通常在struct初始化的时候创建。通常,如果某个struct只需要创建一个实例的时候,会为其定义一个getInstance()
方法,创建的单例实例会通过这个方法返回给调用者。
因为Go语言中有goroutines,它会给单例模式的应用带来一些麻烦。我们在构建单例模式的时候必须要考虑到在多个goroutines访问struct的getInstance()
方法的时候应该返回相同的实例。下面的代码演示了如何正确的创建一个单例对象:
var lock = &sync.Mutex{} type single struct { } var singleInstance *single func getInstance() *single { if singleInstance == nil { lock.Lock() defer lock.Unlock() if singleInstance == nil { fmt.Println("Creting Single Instance Now") singleInstance = &single{} } else { fmt.Println("Single Instance already created-1") } } else { fmt.Println("Single Instance already created-2") } return singleInstance }
09-11 09:28