-
- using System.Collections.Generic;
-
- /// <summary>
- /// 对象池,用于获取和回收常用对象,避免每次都创建一个新的
- /// </summary>
- public static class ObjectPool
- {
- private static Dictionary<string, Stack<IPoolItem>> _pool = new Dictionary<string, Stack<IPoolItem>>();
-
- /// <summary>
- /// 回收一个对象
- /// </summary>
- public static void Reclaim(IPoolItem poolItem)
- {
- if (poolItem.IsRecycled)
- {
- return;
- }
- var logotype = poolItem.Logotype;
- if (!_pool.TryGetValue(logotype, out var poolItems))
- {
- poolItems = new Stack<IPoolItem>();
- _pool.Add(logotype, poolItems);
- }
-
- poolItems.Push(poolItem);
- poolItem.IsRecycled = true;
- poolItem.OnReclaim();
- }
-
- /// <summary>
- /// 根据标识从池中取出一个实例,如果没有该标识类型的实例,则返回null
- /// </summary>
- public static IPoolItem GetItem(string logotype)
- {
- if (_pool.TryGetValue(logotype, out var poolItems))
- {
- if (poolItems.Count > 0)
- {
- var poolItem = poolItems.Pop();
- poolItem.IsRecycled = false;
- poolItem.OnLeavePool();
- return poolItem;
- }
- }
-
- return null;
- }
-
- /// <summary>
- /// 根据标识从池中取出一个实例,如果没有该标识类型的实例,则返回null
- /// </summary>
- public static T GetItem<T>(string logotype) where T : IPoolItem
- {
- return (T)GetItem(logotype);
- }
-
- /// <summary>
- /// 销毁所有池中的物体
- /// </summary>
- public static void DisposeAllItem()
- {
- foreach (var keyValuePair in _pool)
- {
- var poolItems = keyValuePair.Value;
- while (poolItems.Count > 0)
- {
- var item = poolItems.Pop();
- item.Destroy();
- }
- }
- _pool.Clear();
- }
- }