你们都知道单例模式。半单例是一个对象,它会根据给定的 id 是否已存在内存中的实例,返回已存在的实例或新的实例。
这是一个半单例对象的生命周期示例
client1
) 请求一个 id 为 obj
的半单例对象。因为该对象还不存在,所以它会被实例化。 client1
暂时保持对该对象的强引用。client2
) 请求一个 id 为 obj
的半单例对象。由于该对象已存在于内存中,因此返回与 client1
使用的相同的实例。client1
和 client2
都释放了他们共享的半单例。它被完全释放。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”对象,当需要注意同一主题在同一时间只能运行一个动作时。该主题将是半单例的键。当 action 被实例化时,如果给定的主题已经有一个 action 正在进行中,则返回已经存在的 action,否则创建一个新的 action。
此项目最初由 François Lamboley 在 happn 工作期间创建。