你们都知道单例模式。半单例是一个对象,它会根据给定 ID 的实例是否已存在于内存中,返回一个已存在的实例或一个新的实例。
以下是一个半单例对象的生命周期示例
client1
) 请求一个 ID 为 obj
的半单例对象。由于该对象尚不存在,因此会被实例化。 client1
目前保持对该对象的强引用。client2
) 请求一个 ID 为 obj
的半单例对象。由于该对象已存在于内存中,因此会返回与 client1
使用的相同的实例。client1
和 client2
都释放了他们共享的半单例。它被完全释放(deallocated)。obj
的半单例对象。由于之前具有此 ID 的半单例不再存在,因此会实例化一个新的对象。在代码中,半单例是任何符合 SemiSingleton
或 SemiSingletonWithFallibleInit
协议的对象。
/* First you need a “Store” that will hold the reference to the existing semi-singletons. */
let semiSingletonStore = SemiSingletonStore(forceClassInKeys: true)
/* To retrieve a semi-singleton instance, you ask the store to give you one. */
let s: MySemiSingleton = semiSingletonStore.semiSingleton(forKey: key)
例如,一个“操作(Action)”对象,需要确保对于同一个主题(subject),同一时间只有一个操作在运行。这个主题将作为半单例的键(key)。当操作被实例化时,如果对于给定的主题已经有一个操作正在进行中,则会返回已经存在的操作,否则会创建一个新的操作。
此项目最初由 François Lamboley 在 happn 工作时创建。