01.创建模式
# 01.单例模式
# 1.1 单例模式介绍
**意图:**保证一个类仅有一个实例,并提供一个访问它的全局访问点。
**主要解决:**一个全局使用的类频繁地创建与销毁。
**何时使用:**当您想控制实例数目,节省系统资源的时候。
**如何解决:**判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
**关键代码:**构造函数是私有的。
# 1.2 懒汉式(双重检测)
package main
import (
"fmt"
"sync"
)
type Singleton struct{} // Singleton 是单例模式类
var singleton *Singleton
var once sync.Once
//GetInstance 用于获取单例模式对象
func GetInstance() *Singleton {
once.Do(func() {
singleton = &Singleton{}
})
return singleton
}
func main() {
ins1 := GetInstance()
ins2 := GetInstance()
fmt.Println(ins1 == ins2) // true
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 02.简单工厂模式
# 2.1 简单工厂模式
**作用:**不直接向客户端(创建的对象)暴露对象创建的细节,而是通过一个工厂类来负责创建各种类的实例
go 语言没有构造函数一说,所以一般会定义NewXXX函数来初始化相关类。
NewXXX 函数返回接口时就是简单工厂模式,也就是说Golang的一般推荐做法就是简单工厂。
# 2.2 代码演示
package main
import (
"fmt"
)
// 1.定义 接口
type API interface {
Say(name string) string
}
// 2.1 hiAPI 是接口 API 一种实现
type hiAPI struct{}
// 2.2 hiAPI结构体 实现 API接口 的方法
func (*hiAPI) Say(name string) string {
return fmt.Sprintf("Hi, %s", name)
}
// 3.1 HelloAPI 是接口 API 另外一种实现
type helloAPI struct{}
// 3.2 helloAPI结构体 实现 API接口 的方法
func (*helloAPI) Say(name string) string {
return fmt.Sprintf("Hello, %s", name)
}
// 4.NewAPI按类型返回Api实例
func NewAPI(t string) API {
if t == "hiAPI" {
return &hiAPI{}
} else if t == "helloAPI" {
return &helloAPI{}
}
return nil
}
func main() {
// 1.工厂模式创建 hiAPI结构体 对象
api := NewAPI("hiAPI")
s1 := api.Say("Tom") // Hi, Tom
fmt.Println(s1)
// 2.工厂模式创建 helloAPI 结构体 对象
api2 := NewAPI("helloAPI")
s2 := api2.Say("Tom")
fmt.Println(s2) // Hello, Tom
}
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
40
41
42
43
44
45
46
47
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
40
41
42
43
44
45
46
47
上次更新: 2024/3/13 15:35:10