using System; using System.Collections.Generic; namespace ETModel { public class ObjectPool: Component { private readonly Dictionary> dictionary = new Dictionary>(); public Component Fetch(Type type) { Queue queue; if (!this.dictionary.TryGetValue(type, out queue)) { queue = new Queue(); this.dictionary.Add(type, queue); } Component obj; if (queue.Count > 0) { obj = queue.Dequeue(); } else { obj = (Component)Activator.CreateInstance(type); } obj.IsFromPool = true; return obj; } public T Fetch() where T: Component { T t = (T) this.Fetch(typeof(T)); return t; } public void Recycle(Component obj) { obj.Parent = this; Type type = obj.GetType(); Queue queue; if (!this.dictionary.TryGetValue(type, out queue)) { queue = new Queue(); this.dictionary.Add(type, queue); } queue.Enqueue(obj); } public void Clear() { foreach (var kv in this.dictionary) { foreach (Component component in kv.Value) { component.IsFromPool = false; component.Dispose(); } } this.dictionary.Clear(); } } }