目录
单例模式
- 单例模式确保程序中一个类最多只有一个实例
- 单例模式也提供访问这个实例的全局点
- 有一些对象其实我们只需要一个,比方说:线程池,缓存,对话框,处理偏好设置和注册表对象,日志对象等。事实上,这类对象只能有一个实例,如果制造出多个实例,就会导致许多问题产生,例如:程序的行为异常、资源使用过量,或者是不一致的结果。
1 | import "sync" |
简单工厂模式
- go 语言没有构造函数一说,所以一般会定义NewXXX函数来初始化相关类。 NewXXX 函数返回接口时就是简单工厂模式,也就是说Golang的一般推荐做法就是简单工厂。
1 | import "fmt" |
工厂方法模式
- 定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
1 | //Operator 是被封装的实际类接口 |
抽象工厂模式
- 提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类
1 | import "fmt" |
策略模式
- 针对接口编程,而不是针对实现编程
- 定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法变化独立于使用算法的客户
1 | import "fmt" |
观察者模式
- 定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
1 | import "fmt" |
装饰者模式
- 动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更具弹性的替代方案。
1 | type Component interface { |
命令模式
- 将请求封装成对象,这可以让你使用不用的请求、队列,或者日志请求来参数化其他对象。
- 命令模式将发出请求的对象和执行请求的对象解耦。
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63import "fmt"
type Command interface {
Execute()
}
type StartCommand struct {
mb *MotherBoard
}
func NewStartCommand(mb *MotherBoard) *StartCommand {
return &StartCommand{
mb: mb,
}
}
func (c *StartCommand) Execute() {
c.mb.Start()
}
type RebootCommand struct {
mb *MotherBoard
}
func NewRebootCommand(mb *MotherBoard) *RebootCommand {
return &RebootCommand{
mb: mb,
}
}
func (c *RebootCommand) Execute() {
c.mb.Reboot()
}
type MotherBoard struct{}
func (*MotherBoard) Start() {
fmt.Print("system starting\n")
}
func (*MotherBoard) Reboot() {
fmt.Print("system rebooting\n")
}
type Box struct {
buttion1 Command
buttion2 Command
}
func NewBox(buttion1, buttion2 Command) *Box {
return &Box{
buttion1: buttion1,
buttion2: buttion2,
}
}
func (b *Box) PressButtion1() {
b.buttion1.Execute()
}
func (b *Box) PressButtion2() {
b.buttion2.Execute()
}