using System; using System.Collections.Generic; namespace KYFramework { public class ComponentQueue : Component { public string TypeName { get; } private readonly Queue queue = new Queue(); public ComponentQueue(string typeName) { this.TypeName = typeName; } public void Enqueue(Component component) { component.Parent = this; this.queue.Enqueue(component); } public Component Dequeue() { return this.queue.Dequeue(); } public Component Peek() { return this.queue.Peek(); } public int Count { get { return this.queue.Count; } } public override void Dispose() { if (this.IsDisposed) { return; } base.Dispose(); while (this.queue.Count > 0) { Component component = this.queue.Dequeue(); component.IsFromPool = false; component.Dispose(); } } } public class ObjectPool : Component { private readonly Dictionary> pool = new Dictionary>(); public T Fetch() where T: class { return this.Fetch(typeof (T)) as T; } public object Fetch(Type type) { Queue queue = null; if (!pool.TryGetValue(type, out queue)) { return Activator.CreateInstance(type); } if (queue.Count == 0) { return Activator.CreateInstance(type); } return queue.Dequeue(); } public void Recycle(object obj) { Type type = obj.GetType(); Queue queue = null; if (!pool.TryGetValue(type, out queue)) { queue = new Queue(); pool.Add(type, queue); } // 一种对象最大为1000个 if (queue.Count > 1000) { return; } queue.Enqueue(obj); } } }