简介
单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问该实例。单例模式通常用于控制对唯一实例的访问,以便在系统中的多个部分之间共享该实例。
比如你去买车,竞拍车,每次出价1块钱,200个人同时出价,但车只有一辆。
Demo
// Singleton 单例类
type Singleton struct {
car string
price int
mux sync.Mutex // 防止竞争,上锁
}
var instance *Singleton
var once sync.Once
// GetInstance 获取单例实例
func GetInstance() *Singleton {
once.Do(func() {
instance = &Singleton{}
})
return instance
}
func (s *Singleton) SetCar(name string) {
s.mux.Lock()
defer s.mux.Unlock()
s.car = name
}
func (s *Singleton) SetPrice() {
s.mux.Lock()
defer s.mux.Unlock()
s.price += 10000
}
func (s *Singleton) Message() (string, int) {
s.mux.Lock()
defer s.mux.Unlock()
return s.car, s.price
}
test
func TestSingleton(t *testing.T) {
var wg sync.WaitGroup
wg.Add(200)
for i := 0; i < 200; i++ {
go func() {
instance := GetInstance()
instance.SetCar("BWM")
instance.SetPrice()
wg.Done()
}()
}
wg.Wait()
instance1 := GetInstance()
fmt.Println(instance1.Message()) // BWM 200
}
作用和场景
全局唯一实例
当系统中需要一个全局唯一的实例来协调不同部分的工作时,可以使用单例模式。
资源共享
单例模式可以确保多个对象共享同一个实例,以便共享资源、数据或状态。
节省资源
在某些情况下,创建实例的代价较高,而且只需要一个实例时,单例模式可以节省资源。
全局访问点
单例模式提供了一个全局的访问点,使得系统中的不同部分可以方便地访问同一个实例。
控制实例数量
控制实例的数量,确保系统中只有一个实例存在。
总体而言,单例模式适用于需要一个全局唯一实例、共享资源或控制实例数量的场景。然而,在使用单例模式时需要注意不要过度使用,避免引入全局状态和依赖关系。