单例模式
-
单例模式的介绍:单例模式是23种设计模式中最为简单和通俗易懂的模式,应用场景也非常多。
-
单例模式的要求:单例模式关键在于必须确保类(结构体)在全局中只能有一个实例,并且提供一个方法访问这个实例。然后在全局中通过这个方法访问的都是同一个实例。
-
单例模式的分类
-
饿汉式:系统加载的时候就已经初始化,确保本身就是线程安全的。
-
懒汉式:只有在第一次调用的时候才会初始化,但在多线程访问这个调用方法的时候会有线程安全问题,可以通过加锁的方式实现互斥访问,或者使用sync.Once确保某个函数只执行一次。
-
-
单例模式的实现代码
- 饿汉式
//饿汉式
package Go
type Hungrystudent struct {
Name string
Age int
}
var studentingle * Hungrystudent
//初始化方法
func init() {
studentingle = &Hungrystudent{
Name: "headmaster",
Age: 23,
}
}
func GetInstenceByHungry() * Hungrystudent{
return studentingle
}
//饿汉式测试代码
func TestGetInstanceByHungry(t *testing.T) {
student1 := single.GetInstenceByHungry()
student2:=single.GetInstenceByHungry()
equal := reflect.DeepEqual(student2, student1)
fmt.Println(equal)//true
}
- 懒汉式
package Go
import "sync"
type student struct {
Name string
Age int
}
var Sluggard *student
var once=&sync.Once{}
func SluggardGetInstence() *student {
if Sluggard==nil{
once.Do(func() {
Sluggard=&student{
Name: "headminster",
Age: 15,
}
})
}
return Sluggard
}
//测试代码
func TestGetInstanceByHungry(t *testing.T) {
student1 := single.GetInstenceByHungry()
student2:=single.GetInstenceByHungry()
equal := reflect.DeepEqual(student2, student1)
fmt.Println(equal)//true
}