创建型:一. 单例模式
单例模式是什么
单例模式是一种创建型设计模式:单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。
为什么要用单例模式
为什么要用单例模式?在系统中某些对象,我们只需要一个全局的,如果每次实例化会浪费资源。所以单例模式可以节约内存,加快对象访问速度,因此单例模式在某些场合适合使用。比如多个模块使用同一个数据源连接对象;比如配置数据可以由一个单例对象统一读取;还有比如日志文件的对象也可以用单例模式。
单例模式怎么实现
我们可以用一个私有的全局变量来保存一个对象,并且提供一个获取对象的方法,在这个方法里面来实现只创建一次。但是要注意多线程的情况,如果多个线程同时访问,也要保证只创建一个对象。这里我们可以用golang的原子操作来实现。我们这里用sync.Once来实现延迟加载,也就是单例模式中的懒汉模式;还有饿汉模式既是初始化的时候就实例对象,方法只是去获取对象,很简单这里就不做累述了。
package singleton
import "sync"
// Singleton 是单例模式接口
// 通过该接口可以避免 GetInstance 返回一个包私有类型的指针
type Singleton interface {
foo()
}
type singleton struct{}
func (s singleton) foo() {}
var (
instance *singleton
once sync.Once
)
//GetInstance 用于获取单例模式对象
func GetInstance() Singleton {
once.Do(func() {
instance = &singleton{}
})
return instance
}
优点
- 为整个系统提供一个全局的访问点,利于管理。
- 全局只有一个该对象,节约内存。
- 避免了频繁的创建销毁,提示性能。
缺点
- 不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误。
- 由于单例模式中没有抽象层,因此单例类的扩展有很大的困难。