定義
一個物件池包含一組已經初始化並且可以使用的物件,可以在有需求時建立和銷燬物件。
物件池的使用者可以從池子中取得物件,對其進行操作處理,並在不需要時歸還給池子而非直接銷燬。
設計的原則和思想
- 解耦了物件的建立和使用。
- 不變部分是使用,變化部分是建立。
- 核心思想是物件複用(一個物件只能被一個物件引用),節省時間。
一句話概括設計模式
單例 + 享元 = 物件池
結構中包含的角色
- 物件池(ObjectPool)
- 物件池的物件(PooledObject)
最小可表達程式碼
class PooledObject
{
private $id;
public function __construct($id)
{
$this->id = $id;
}
public function getId()
{
return $this->id;
}
}
class ObjectPool
{
private static $resources = [];
public static function add(PooledObject $resource)
{
self::$resources[$resource->getId()] = $resource;
}
public static function get($id)
{
return self::$resources[$id] ?? null;
}
}
$id = 1;
ObjectPool::add(new PooledObject($id));
var_dump(ObjectPool::get($id)->getId(), ObjectPool::get($id)->getId());
優點
- 複用池中物件,
- 節省建立物件所需要的資源。
- 不必重複初始化物件狀態,
缺點
- 併發環境中,因為鎖競爭而產生阻塞,這種開銷要比建立銷燬物件的開銷高非常多。
- 設計一個好的物件池的難度高。
何時使用
- 頻繁建立、銷燬物件並且物件建立、銷燬開銷很大的場景
- 資源(記憶體,CPU,網路等)受限的場景。
實際應用場景
- 資料庫連線池
- 任務佇列池
- 遊戲開發的遊戲物體。
- 管理記憶體。預先申請一片連續的記憶體空間作為物件池。
本作品採用《CC 協議》,轉載必須註明作者和本文連結