using System.Collections.Concurrent;
namespace Milimoe.FunGame.Core.Api.Utility
{
///
/// 单例表:表中的对象以类名作为Key保存,并以Key获取该对象,Key具有唯一约束
/// 用于储存单例对象使用
///
public class Singleton
{
private static readonly ConcurrentDictionary SingletonTable = [];
///
/// 查询目标的类是否已经有实例
///
/// 单例对象
///
public static bool IsExist(object single)
{
Type type = single.GetType();
string name = type.FullName ?? type.ToString();
return SingletonTable.ContainsKey(name);
}
///
/// 将目标和目标的类添加至单例表,如果存在,将更新此类单例
///
/// 单例对象
/// 存入基类
///
public static void AddOrUpdate(object single, bool baseClass = false)
{
if (single != null)
{
Type? type = baseClass ? single.GetType().BaseType : single.GetType();
string name = type?.FullName ?? type?.ToString() ?? "";
if (name != "") SingletonTable.AddOrUpdate(name, single, (key, oldValue) => single);
}
}
///
/// 将目标和目标的类从单例表中移除
///
/// 单例对象
///
public static bool Remove(object single)
{
Type type = single.GetType();
string name = type.FullName ?? type.ToString();
return SingletonTable.TryRemove(name, out _);
}
///
/// 获取单例对象
///
/// 目标类
///
public static T? Get()
{
string name = typeof(T).FullName ?? typeof(T).ToString();
if (SingletonTable.TryGetValue(name, out object? value) && value is T single)
{
return single;
}
return default;
}
///
/// 获取单例对象
///
/// 目标类
///
public static object? Get(Type type)
{
string name = type.FullName ?? type.ToString();
if (SingletonTable.TryGetValue(name, out var value))
{
return value;
}
return null;
}
}
}