using System; using System.Collections.Generic; namespace BehaviorDesigner.Runtime { public static class ObjectPool { private static Dictionary poolDictionary = new Dictionary(); private static Object lockObject = new Object(); public static T Get() { T newObject; lock (lockObject) { if (poolDictionary.ContainsKey(typeof(T))) { var pooledObjects = poolDictionary[typeof(T)] as Stack; if (pooledObjects.Count > 0) { return pooledObjects.Pop(); } } newObject = (T) TaskUtility.CreateInstance(typeof(T)); } return newObject; } public static void Return(T obj) { if (obj == null) { return; } lock (lockObject) { object value; if (poolDictionary.TryGetValue(typeof(T), out value)) { var pooledObjects = value as Stack; pooledObjects.Push(obj); } else { var pooledObjects = new Stack(); pooledObjects.Push(obj); poolDictionary.Add(typeof(T), pooledObjects); } } } public static void Clear() { lock (lockObject) { poolDictionary.Clear(); } } } }