Go语言设计模式
一、创建型设计模式
1. 单例模式
单例模式(Singleton Pattern)是一种常用的软件设计模式。单例模式的类提供了一种访问其唯一对象的方法,该对象可以直接被访问,无须实例化。单例模式保证了一个类的对象只存在一个,同时维护了一个对其对象的全局访问点。
type type Singleton struct {
Value int
}
var instance *Singleton
var mutex *sync.Mutex1.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
}优缺点
优点
单例模式可以拓展为工厂模式
对于需要频繁创建和销毁对象的系统,使用单例模式可以提升系统的性能。
缺点
可拓展性差
如果实例化的对象长时间没有被使用,会被GC,导致对象缺失。
工厂方法模式
1.1 使用场景
在程序开发过程中,如果开发者无法预知对象的具体类型及其依赖关系,则可以使用工厂方法模式。工厂方法模式将创建产品的工厂代码与产品代码分离,从而降低代码之间的耦合度。例如,如果需要添加一件新产品,则只需创建一个新的具体工厂类,然后重写其工厂方法。
如果开发者希望其它开发者可以拓展软件库或框架的内部组件,则可以使用工厂方法模式
许可协议:
CC BY 4.0