温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

go中设计模式之创建型模式

发布时间:2020-08-11 07:14:20 来源:网络 阅读:537 作者:wx5cf612fe3a728 栏目:编程语言

设计模式总共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

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI