单例模式
      单例模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
        
          单例模式要点
      
- 单例类只能有一个实例。
- 单例类必须自己创建自己的唯一实例。
- 单例类必须给所有其他对象提供这一实例。
          golang demo
      通过 sync 包实现
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 
 | package singletonpattern
 import "sync"
 
 type Singleton interface {
 showMessage() string
 }
 
 type singleton struct{}
 
 var	instance  *singleton
 
 func (s *singleton) showMessage() string {
 return "singleton message"
 }
 
 func getInstance() *singleton {
 var once sync.Once
 once.Do(func() {
 instance = new(singleton)
 })
 return instance
 }
 
 | 
test
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 
 | package singletonpattern
 import (
 "sync"
 "testing"
 )
 
 func TestSingleton1(t *testing.T) {
 s1 := getInstance()
 s2 := getInstance()
 if s1 != s2 {
 t.Fatal("error")
 }
 }
 
 const parCount = 100
 
 func TestParallelSingleton(t *testing.T) {
 start := make(chan struct{})
 wg := sync.WaitGroup{}
 wg.Add(parCount)
 instances := [parCount]Singleton{}
 for i := 0; i < parCount; i++ {
 go func(index int) {
 
 <-start
 instances[index] = getInstance()
 wg.Done()
 }(i)
 }
 
 close(start)
 wg.Wait()
 for i := 1; i < parCount; i++ {
 if instances[i] != instances[i-1] {
 t.Fatal("instance is not equal")
 }
 }
 }
 
 | 
          参考