设计模式-单例模式golang实现

单例模式

单例模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

单例模式要点

  • 单例类只能有一个实例。
  • 单例类必须自己创建自己的唯一实例。
  • 单例类必须给所有其他对象提供这一实例。

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) {
//协程阻塞,等待channel被关闭才能继续运行
<-start
instances[index] = getInstance()
wg.Done()
}(i)
}
// 关闭channel,所有协程同时开始运行,实现并行(parallel)
close(start)
wg.Wait()
for i := 1; i < parCount; i++ {
if instances[i] != instances[i-1] {
t.Fatal("instance is not equal")
}
}
}

参考

Search by:GoogleBingBaidu