设计模式总共24种, 本篇教你学会在go语言中使用创建型模式
创建型: 单例模式 简单工厂模式 工厂方法模式 抽象工厂模式 建造者模式 原型模式
结构型: 代理模式 适配器模式 装饰器模式 桥接模式 组合模式 享元模式 外观模式
行为型: 观察者模式 模板方法模式 命令模式 状态模式 职责链模式 解释器模式 中介者模式 访问者模式 策略模式 备忘录模式 迭代器模式
单例模式
1. 定义: 单例是一个软件设计标准。该标准保证只存在一个类的实例,同时保持对其对象的全局访问点
2. 代码示例:
// Singleton 单例结构
type Singleton struct{}
var (
// 定义单例对象和sync.Once变量组声明
singleton *Singleton
once sync.Once
)
// 实现初始化单例对象私有函数
func initSingleton() {
singleton = &Singleton{}
}
// GetInstance 用于获取单例对象
func GetInstance() *Singleton {
once.Do(initSingleton)
return singleton
}
3. 实现步骤
- 定义单例结构
- 定义单例对象和sync.Once变量组声明
- 实现初始化单例对象私有函数
- 实现导出单例对象函数,并once.Do调用初始化操作
4. 使用场景
初始化包全局变量使用,如log初始化等,对于能在 main 中直接完成的初始化操作可以不使用单例模式。
5. 优点
单例模式的主要优点在于提供了对唯一实例的受控访问并可以节约系统资源
6. 深入阅读
https://medium.com/golang-issue/how-singleton-pattern-works-with-golang-2fdd61cd5a7f
工厂模式
1. 定义: 可以根据参数的不同返回不同类的实例,因为go中没有继承,所以不用区分简单工厂模式、工厂方法模式 抽象工厂模式。
2. 代码示例:
// 定义 API 接口
type API interface {
Save()
}
// 定义 New 函数返回 API
func NewAPI(name string) API {
if name == "mem" {
return &memAPI{}
} else if name == "file" {
return &fileAPI{}
}
return nil
}
// 实现接口类型
type memAPI struct{}
func (*memAPI) Save() {
}
// 实现接口类型
type fileAPI struct{}
func (*fileAPI) Save() {
}
3. 实现步骤
- 定义 API 接口
- 定义 New 函数返回 API
- 实现接口类型
- 补充New函数,返回实现类型
4. 使用场景
常用于组件开发中,如消息中间件、缓存中间件
5. 优点
封装了实现细节,将对象的创建和使用分离,方便内部实现扩展
建造者模式
1. 定义: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
2. 代码示例:
// Builder 建造者接口
type Builder interface {
Part1()
Part2()
Part3()
}
// Director 指挥官
type Director struct {
builder Builder
}
func NewDirector(builder Builder) *Director {
return &Director{
builder: builder,
}
}
func (d *Director) Construct() {
d.builder.Part1()
d.builder.Part2()
d.builder.Part3()
}
type Builder1 struct {
result string
}
func (b *Builder1) Part1() {
b.result += "1"
}
func (b *Builder1) Part2() {
b.result += "2"
}
func (b *Builder1) Part3() {
b.result += "3"
}
func (b *Builder1) GetResult() string {
return b.result
}
type Builder2 struct {
result int
}
func (b *Builder2) Part1() {
b.result += 1
}
func (b *Builder2) Part2() {
b.result += 2
}
func (b *Builder2) Part3() {
b.result += 3
}
func (b *Builder2) GetResult() int {
return b.result
}
3. 实现步骤
- 定义 构建 Builder 接口
- 定义 Director 实现构建过程
- 实现 Builder 接口
4. 使用场景
在很多游戏软件中,地图包括天空、地面、背景等组成部分,人物角色包括人体、服装、装备等组成部分,可以使用建造者模式对其进行设计,通过不同的具体建造者创建不同类型的地图或人物。
5. 优点
将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
原型模式
1. 定义: 通过“复制”一个已经存在的实例来返回新的实例,而不是新建实例。被复制的实例就是我们所称的“原型”。
2. 代码示例:
// 示例结构体
type Example struct {
Content string
}
func (e *Example) Clone() *Example {
res := *e
return &res
}
func main() {
r1 := new(Example)
r1.Content = "this is example 1"
r2 := r1.Clone()
r2.Content = "this is example 2"
fmt.Println(r1)
fmt.Println(r2)
}
3. 实现步骤
- 创建一个结构体
- 添加克隆方法
4. 使用场景
相似但重新创建会比较繁琐的对象
5. 优点
参考链接:
https://www.cnblogs.com/zuoxiaolong/p/pattern26.html
https://design-patterns.readthedocs.io/zh_CN/latest/index.html
有疑问加站长微信联系(非本文作者)