设计模式是针对软件设计中出现的常见问题的经过尝试和测试的解决方案。它们提供了以灵活且可重用的方式解决这些问题的模板或指南。
每种模式都代表了开发人员可以适应其特定环境的最佳实践。设计模式通常分为三大类。
为了开始这个系列,我们先来谈谈单例模式。
单例模式确保一个类只有一个实例,并提供对该实例的全局访问点。
这在您需要管理共享资源(例如数据库连接或配置设置)的情况下非常有用。
通常需要确保某个类仅存在一个实例,例如在管理配置或与硬件资源交互时。如果没有 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 确保仅创建一个单例实例,即使多次调用也是如此。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3