Если коротко:
Код AS3:
package package_cl{
import flash.display.MovieClip;
public class VectorPool_cl {
// Вектор может динамически расширяться - не надо его пересоздавать под каждый размер
private var vector:Vector.<MovieClip> = new Vector.<MovieClip>();
public function VectorPool_cl() {
}
pulbic function fn_get():MovieClip{
if (vector.length > 0) {
// Фишка пула - это не создавать новый экземпляр,
// если можно использовать ранее созданный
return vector.pop();
}
// Не создавали раньше ничего - значит всё-таки надо создать
return new MovieClip();
}
public function fn_push(movieClip:MovieClip):void{
vector.push(movieClip);
}
}
}
Использование:
Код AS3:
public static var pool:VectorPool_cl = new VectorPool_cl();
...
a = pool.fn_get()
addChild(a);
...
removeChild(a)
// Вторая фишка пула - нужно _вручную_ туда добавлять ставшие ненужными объекты,
// иначе все время будет вызываться new MovieClip(); и от пула не будет никакого толку
pool.fn_push(a);
...
// И только здесь начинается выгода от использования пула,
// b присваивается то, что было в a, без создания MovieClip заново
b = pool.fn_get()
Но вы хотите универсальный пул. Тогда нужно как-то научиться создавать не просто MovieClip, а объект заранее заданного типа внутри пула
Решения:
1. Как в приведённой выше ссылке назначить пулу фабрику объектов
(вместо фабрики подойдет просто функция, создающуя объект, или просто класс объекта)
2. А нужна ли вам универсальность? Просто копипастим класс пула и меняем MovieClip на нужный тип.
Что? Копипаста не всегда является злом:
- С одной стороны - это дублирование двух функций.
Но с другой - это строгая типизация и не надо громоздить фабрик.
Плюс в этих функцях мало что дублируется - там if один всего
- Вы особо и не накопипастите - не будет у вас много пулов.
Вы будете заводить пул только когда:
а) Объекты часто создаются и часто "уничтожаются" (перестают использоваться)
б) Создание экземпляров этих объектов является узким местом в приложении
с) Вы можете сказать, когда объект стал ненужным, т.е. знаете в каком месте написать:
Код AS3:
pool.fn_push(object);