用函数式模拟设计模式-单例

62 阅读1分钟

1. 同步获取实例的方法, 具体如何产生对象交给传入的函数

func SyncGetSingleton(f func() interface{}) func() interface{} {
	var obj interface{}
	mutex := new(sync.Mutex)
	return func() interface{} {
		if obj == nil {
			mutex.Lock()
			defer mutex.Unlock()
			if obj == nil {
				obj=f()
			}
			return obj
		}
		return obj
	}
}

2. 产生对象的方法

可以理解为一个工厂方法

factory=func() interface{} {
 //构造对象
 obj:=new(Some)
 return obj
}

3. 组合起来

//获取产生对象的方法
var syncGetObj=SyncGetSingleton(factory)

4. 使用

obj:=syncGetObj()
调用obj方法, 处理具体业务逻辑