单例模式
单例模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
单例模式要点
- 单例类只能有一个实例。
- 单例类必须自己创建自己的唯一实例。
- 单例类必须给所有其他对象提供这一实例。
golang demo
通过 sync 包实现
1 2 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
1 2 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") } } }
|
参考