单例模式

  • 单例模式的介绍:单例模式是23种设计模式中最为简单和通俗易懂的模式,应用场景也非常多。

  • 单例模式的要求:单例模式关键在于必须确保类(结构体)在全局中只能有一个实例,并且提供一个方法访问这个实例。然后在全局中通过这个方法访问的都是同一个实例。

  • 单例模式的分类

    • 饿汉式:系统加载的时候就已经初始化,确保本身就是线程安全的。

    • 懒汉式:只有在第一次调用的时候才会初始化,但在多线程访问这个调用方法的时候会有线程安全问题,可以通过加锁的方式实现互斥访问,或者使用sync.Once确保某个函数只执行一次。

  • 单例模式的实现代码

    1. 饿汉式
  //饿汉式
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

}

  1. 懒汉式
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
}


posted @ 2020-11-08 21:37  月下繁星杨  阅读(91)  评论(0编辑  收藏  举报