go中设计模式之创建型模式-创新互联

设计模式总共24种, 本篇教你学会在go语言中使用创建型模式

成都创新互联公司主营顺昌网站建设的网络公司,主营网站建设方案,重庆App定制开发,顺昌h5小程序设计搭建,顺昌网站营销推广欢迎顺昌等地区企业咨询
创建型:  单例模式   简单工厂模式   工厂方法模式   抽象工厂模式  建造者模式  原型模式
结构型:  代理模式   适配器模式   装饰器模式   桥接模式   组合模式   享元模式  外观模式 
行为型:  观察者模式   模板方法模式   命令模式   状态模式   职责链模式   解释器模式   中介者模式   访问者模式   策略模式  备忘录模式  迭代器模式

单例模式

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

创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。


分享文章:go中设计模式之创建型模式-创新互联
文章出自:http://azwzsj.com/article/cohheg.html