创建型:一. 单例模式

单例模式是什么

单例模式是一种创建型设计模式:单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。

为什么要用单例模式

为什么要用单例模式?在系统中某些对象,我们只需要一个全局的,如果每次实例化会浪费资源。所以单例模式可以节约内存,加快对象访问速度,因此单例模式在某些场合适合使用。比如多个模块使用同一个数据源连接对象;比如配置数据可以由一个单例对象统一读取;还有比如日志文件的对象也可以用单例模式。

单例模式怎么实现

我们可以用一个私有的全局变量来保存一个对象,并且提供一个获取对象的方法,在这个方法里面来实现只创建一次。但是要注意多线程的情况,如果多个线程同时访问,也要保证只创建一个对象。这里我们可以用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
}

优点

  1. 为整个系统提供一个全局的访问点,利于管理。
  2. 全局只有一个该对象,节约内存。
  3. 避免了频繁的创建销毁,提示性能。

缺点

  1. 不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误。
  2. 由于单例模式中没有抽象层,因此单例类的扩展有很大的困难。
posted @ 2022-03-16 22:59  EthanWell  阅读(128)  评论(0编辑  收藏  举报