对象接口:JTIPoolObject
export interface JTIPoolObject { /*** * 回收重写此方法 */ recycle(); }
对象池接口:
export interface JTIPool
{
get():T
getFromClass(methodName:string, args?:any[]):T;
getToMethod(methodName:string, args?:any[]):T;
put(item:T):void
clear():void;
removeAt(index:number):T
size:number;
}
通用对像池实现:
export default class JTPool implements JTIPool
{
protected _cls:any = null;
protected _pool:T[] = null;
protected _size = 0;
constructor(cls:any)
{
this._cls = cls;
this._pool = [];
}public get():T { if (this._size > 0) { this._size --; return this._pool.pop(); } return new this._cls(); } public getFromClass(methodName:string = "createInstance", args?:any[]):T { if (this._size > 0) { this._size --; return this._pool.pop(); } return this._cls[methodName](args); } public getToMethod(methodName: string, args?: any[]): T { let item:T = this.get(); item[methodName].apply(item, args ? args :[null]); return item; } public put(item:T):void { if (!item) return; if (!~this._pool.indexOf(item)) { item.recycle(); this._pool.push(item); this._size ++; } } public removeAt(index:number):T { let item:T = this._pool[index]; this._pool.splice(index, 1); return item; } public clear():void { this._size = this._pool.length = 0; this._cls = null; } public get size():number { return this._size; } protected static _poolMap:Map<any, JTIPool<JTIPoolObject>> = new Map(); public static instance<T extends JTIPoolObject>(cls:any):JTIPool<T> { var pool:JTIPool<T> = this._poolMap.get(cls) as JTIPool<T>; if (!pool) { pool = new this(cls) as JTIPool<T>; this._poolMap.set(cls, pool); } return pool; } public static get<T extends JTIPoolObject>(cls:any):T { let pool:JTIPool<T> = this.instance(cls); return pool.get(); } public static put<T extends JTIPoolObject>(cls:any, item:T):void { this.instance(cls).put(item); } public static del<T extends JTIPoolObject>(cls:any):JTIPool<T> { let pool:JTIPool<T> = this._poolMap.get(cls) as JTIPool<T> if (pool) { pool.clear(); this._poolMap.delete(cls) } return pool; } public static getFromClass<T extends JTIPoolObject>(cls:any, methodName:string, args?:any[]):T { let pool:JTIPool<T> = this.instance(cls); return pool.getFromClass(methodName, args) } }
使用方法: JTPool.get(ObjectClass);
JTPool.put(ObjectClass, Object)