41 lines
1.1 KiB
GDScript
41 lines
1.1 KiB
GDScript
## ObjectPool — 通用对象池(Autoload: ObjectPool)
|
||
## 权威来源:implementation_plan.md §2.1 Layer-0
|
||
##
|
||
## 使用约定:
|
||
## 1. 被池化对象必须实现 reset() 方法 (签名:func reset() -> void)
|
||
## 2. 取出:pool.acquire() → 返回对象(内部已调 reset())
|
||
## 3. 归还:pool.release(obj)
|
||
extends Node
|
||
|
||
## 创建一个指定工厂和容量的对象池
|
||
func create_pool(capacity: int, factory: Callable) -> PoolInstance:
|
||
var p := PoolInstance.new()
|
||
p._factory = factory
|
||
for _i in capacity:
|
||
p._stack.append(factory.call())
|
||
return p
|
||
|
||
# ── PoolInstance 内部类(业务系统持有实例) ──────────────────────────────
|
||
class PoolInstance:
|
||
var _factory: Callable
|
||
var _stack: Array = []
|
||
|
||
func acquire() -> Object:
|
||
var obj: Object
|
||
if _stack.is_empty():
|
||
obj = _factory.call()
|
||
else:
|
||
obj = _stack.pop_back()
|
||
if obj.has_method("reset"):
|
||
obj.reset()
|
||
return obj
|
||
|
||
func release(obj: Object) -> void:
|
||
_stack.append(obj)
|
||
|
||
func get_available_count() -> int:
|
||
return _stack.size()
|
||
|
||
func drain() -> void:
|
||
_stack.clear()
|