Samwey—–优雅设计 万能通用对象池——JTPool

对象接口: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)

卖炒饭的我看到你们这么卷,真的一边炒饭一边流泪 :sneezing_face:

你家的炒饭顾客有没有反应太咸了 :sweat_smile:

:joy:

得有人才能卷啊,现在无人卷。自己在卷自己 :joy: :joy: :joy: :joy:

生意惨淡。顾客挑食的呢。