package com.lfk.justweengine.engine;
import com.lfk.justweengine.drawable.Sprite.BaseSub;
import java.util.HashMap;
/**
* 对象池组
* Created by liufengkai on 16/4/25.
*/
public class ObjectPoolGroup {
// ObjectPoolGroup
private final HashMap<String, ObjectPool<?>> freeObjectsHashMap;
// default factory method
private final ObjectPool.publicObjectFactory factory;
// default max size
private final int maxSize;
/**
* 初始化对象池
*
* @param factory 这里的工厂方法是BaseSub的默认生成方法,
* 如果你所需要的方法不存在则默认使用
* @param maxSize 对象池的默认选项
*/
public ObjectPoolGroup(ObjectPool.publicObjectFactory factory, int maxSize) {
this.maxSize = maxSize;
this.factory = factory;
this.freeObjectsHashMap = new HashMap<>();
}
/**
* 注册工厂方法
*
* @param objectType 类
* @param factory 工厂方法(注意泛型与上文一致)
* @param maxSize 最大数量
* @param <T> 泛型
*/
public <T> ObjectPool<T> registerFactory(Class<T> objectType,
ObjectPool.publicObjectFactory<T> factory,
int maxSize) {
ObjectPool<T> objectPool = ObjectPool.newInstance(objectType, factory, maxSize);
this.freeObjectsHashMap.put(objectType.getName(), objectPool);
return objectPool;
}
public <T> ObjectPool<T> registerFactory(Class<T> objectType,
ObjectPool.publicObjectFactory<T> factory) {
ObjectPool<T> objectPool = ObjectPool.newInstance(objectType, factory, maxSize);
this.freeObjectsHashMap.put(objectType.getName(), objectPool);
return objectPool;
}
/**
* 注销工厂方法
*
* @param objectType 类
*/
public void unregisterFactory(Class objectType) {
this.freeObjectsHashMap.remove(objectType.getName());
}
/**
* 使用类型名进行生成调用
*
* @param type BaseSub类型
* @return 新建对象
*/
public <T> T newObject(Class<T> type) {
T object;
if (freeObjectsHashMap.size() == 0) {
if (freeObjectsHashMap.containsKey(type.getName())) {
object = (getObjectPool(type)).newObject();
} else {
object = (getPublicFactory(type)).createObject();
}
} else
object = (getObjectPool(type)).remove();
return object;
}
/**
* 获取对象池
*
* @param clazz 类
* @param <T> 泛型
* @return 对应的对象池
*/
@SuppressWarnings("unchecked")
public <T> ObjectPool<T> getObjectPool(Class<T> clazz) {
return (ObjectPool<T>) freeObjectsHashMap.get(clazz.getName());
}
@SuppressWarnings("unchecked")
public <T> ObjectPool<T> getObjectPool(String baseSub) {
return (ObjectPool<T>) freeObjectsHashMap.get(baseSub);
}
@SuppressWarnings("unchecked")
private <T> ObjectPool.publicObjectFactory<T> getPublicFactory(Class<T> clazz) {
return (ObjectPool.publicObjectFactory<T>) factory;
}
/**
* baseSub 和 类有相同的名字
*
* @param baseSub 物体
* @param <T> 泛型
*/
public <T extends BaseSub> void free(T baseSub) {
getObjectPool(baseSub.s_name).free(baseSub);
}
public void clear() {
freeObjectsHashMap.clear();
}
}