我们专注攀枝花网站设计 攀枝花网站制作 攀枝花网站建设
成都网站建设公司服务热线:400-028-6601

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

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

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

坚守“ 做人真诚 · 做事靠谱 · 口碑至上 · 高效敬业 ”的价值观,专业网站建设服务10余年为成都茶艺设计小微创业公司专业提供成都定制网站营销网站建设商城网站建设手机网站建设小程序网站建设网站改版,从内容策划、视觉设计、底层架构、网页布局、功能开发迭代于一体的高端网站建设服务。

创建型:  单例模式   简单工厂模式   工厂方法模式   抽象工厂模式  建造者模式  原型模式
结构型:  代理模式   适配器模式   装饰器模式   桥接模式   组合模式   享元模式  外观模式 
行为型:  观察者模式   模板方法模式   命令模式   状态模式   职责链模式   解释器模式   中介者模式   访问者模式   策略模式  备忘录模式  迭代器模式

单例模式

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


网站栏目:go中设计模式之创建型模式
网站地址:http://mswzjz.cn/article/jsipih.html

其他资讯