春

春夏秋冬平平安安

A text-focused Halo theme

  • 首页
  • 关于
主页 Go语言设计模式
文章

Go语言设计模式

发表于 29天前 更新于 29天前
作者 Administrator
10~13 分钟 阅读

一、创建型设计模式

1. 单例模式

单例模式(Singleton Pattern)是一种常用的软件设计模式。单例模式的类提供了一种访问其唯一对象的方法,该对象可以直接被访问,无须实例化。单例模式保证了一个类的对象只存在一个,同时维护了一个对其对象的全局访问点。

type type Singleton struct {
    Value int
}
​
var instance *Singleton
​
var mutex *sync.Mutex

1.1 懒汉式单例模式

懒汉式单例模式是指,在创建对象时,不直接创建对象,在加载配置文件时才创建对象。需要加锁保证并发安全。

func LazyGetInstance() *Singleton {
    mutex.Lock()
    defer mutex.Unlock()
    if instance == nil {
        instance = new(Singleton)
    }
    return instance
}

1.2 饿汉式单例模式

在创建对象时,不判断创建的对象是否为空,直接创建对象。时并发安全的,唯一的缺点时在导入包的同时会创建对象,并且创建的对象会持续存在与内存中。

// 导入包时创建
func init() {
    if instance == nil {
        instance = new(Singleton)
        fmt.Println("创建单个实例")
    }
}
​
func HungryGetInstance() *Singleton {
    return instance
}

1.3 双重检查单例模式

func DoubleCheckGetInstance() *Singleton {
    if instance == nil {
        mutex.Lock()
        if instance == nil {
            instance = new(Singleton)
            fmt.Println("创建单个实例")
        }
        mutex.Unlock()
    }
    return instance
}

1.4 sync.Once单例模式

init()函数会在包被首次加载的时候执行,如果被加载的包不立即使用,会浪费内存空间和程序加载时间。

var once sync.Once
​
func OnceGetInstance() *Singleton {
    once.Do(func() {
        instance = new(Singleton)
        fmt.Println("创建单个实例")
    })
    return instance
}

优缺点

  1. 优点

    • 单例模式可以拓展为工厂模式

    • 对于需要频繁创建和销毁对象的系统,使用单例模式可以提升系统的性能。

  2. 缺点

    • 可拓展性差

    • 如果实例化的对象长时间没有被使用,会被GC,导致对象缺失。

工厂方法模式

1.1 使用场景

  • 在程序开发过程中,如果开发者无法预知对象的具体类型及其依赖关系,则可以使用工厂方法模式。工厂方法模式将创建产品的工厂代码与产品代码分离,从而降低代码之间的耦合度。例如,如果需要添加一件新产品,则只需创建一个新的具体工厂类,然后重写其工厂方法。

  • 如果开发者希望其它开发者可以拓展软件库或框架的内部组件,则可以使用工厂方法模式

许可协议:  CC BY 4.0
分享

相关文章

下一篇

containerd安装配置

上一篇

消息中间件

最近更新

  • kafka Kraft模式k8s集群搭建
  • 达梦数据库主备集群搭建
  • RocketMQ proxy
  • 凝思操作系统开启系统日志
  • kubernetes学习记录

热门标签

Halo

目录

©2025 春夏秋冬平平安安. 保留部分权利。

使用 Halo 主题 Chirpy