设计模式是针对软件设计中出现的常见问题的经过尝试和测试的解决方案。他们提供了一个模板或指南,用于以灵活且可重用的方式解决这些问题。
每种模式都代表了开发人员可以适应其特定环境的最佳实践。设计模式通常分为三大类。
为了开始这个系列,我们先来谈谈单例模式。
单例模式确保一个类只有一个实例,并提供对该实例的全局访问点。
这在您需要管理共享资源(例如数据库连接或配置设置)的情况下非常有用。
通常需要确保某个类仅存在一个实例,例如在管理配置或与硬件资源交互时。如果没有 Singleton,创建多个实例可能会导致数据不一致或资源锁定等问题。
在使用异步代码时,这种情况很常见,其中多个 goroutine 可以创建类的新实例或访问共享资源。
考虑数据库连接池:如果应用程序的多个部分同时创建新连接,则最终可能会出现冗余或冲突的数据库交互。单例确保在整个应用程序中仅创建和使用一个连接。
package main import ( "fmt" "sync" ) type Singleton interface { DoSomething() string } type singleton struct{} var lock = &sync.Mutex{} var instance *singleton func NewSingletonInstance() *singleton { if instance == nil { lock.Lock() defer lock.Unlock() if instance == nil { fmt.Println("Creating single instance now.") instance = &singleton{} } else { fmt.Println("Single instance already created.") } } else { fmt.Println("Single instance already created.") } return instance } func (s *singleton) DoSomething() string { return "Doing something." } func main() { instance1 := NewSingletonInstance() instance2 := NewSingletonInstance() fmt.Printf("%p\n", instance1) fmt.Printf("%p\n", instance2) }
函数 NewSingletonInstance 确保仅创建一个单例实例,即使多次调用也是如此。
以上是Go 设计模式#Singleton的详细内容。更多信息请关注PHP中文网其他相关文章!