極簡設計模式-物件池模式

long2ge發表於2021-12-14

定義

一個物件池包含一組已經初始化並且可以使用的物件,可以在有需求時建立和銷燬物件。
物件池的使用者可以從池子中取得物件,對其進行操作處理,並在不需要時歸還給池子而非直接銷燬。

設計的原則和思想

  1. 解耦了物件的建立和使用。
  2. 不變部分是使用,變化部分是建立。
  3. 核心思想是物件複用(一個物件只能被一個物件引用),節省時間。

一句話概括設計模式

單例 + 享元 = 物件池

結構中包含的角色

  1. 物件池(ObjectPool)
  2. 物件池的物件(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());

優點

  1. 複用池中物件,
  2. 節省建立物件所需要的資源。
  3. 不必重複初始化物件狀態,

缺點

  1. 併發環境中,因為鎖競爭而產生阻塞,這種開銷要比建立銷燬物件的開銷高非常多。
  2. 設計一個好的物件池的難度高。

何時使用

  1. 頻繁建立、銷燬物件並且物件建立、銷燬開銷很大的場景
  2. 資源(記憶體,CPU,網路等)受限的場景。

實際應用場景

  1. 資料庫連線池
  2. 任務佇列池
  3. 遊戲開發的遊戲物體。
  4. 管理記憶體。預先申請一片連續的記憶體空間作為物件池。
本作品採用《CC 協議》,轉載必須註明作者和本文連結
Long2Ge

相關文章