首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 設計模式:單例與多例模式實作解析

     編輯:PHP 相關知識

單例模式確保一個類只有一個實例,並提供全域存取點;多例模式則允許針對不同鍵值擁有多個唯一實例。本文解析兩者在 PHP 中的實作與適用場景。

單例模式

特點

  • 私有建構子,防止外部 new。
  • 靜態方法 getInstance() 回傳唯一實例。
  • 適用於配置管理、資料庫連線、日誌記錄器等全域共享資源。

程式碼範例

<?php
class SingletonExample {
    private function __construct() {} // 防止直接實例化
    public static function getInstance() {
        static $instance = null; // 函數靜態變數,跨呼叫共享
        if ($instance === null) {
            $instance = new SingletonExample();
        }
        return $instance;
    }
}
$obj1 = SingletonExample::getInstance();
$obj2 = SingletonExample::getInstance();
var_dump($obj1 === $obj2); // true,同一個實例
?>

注意事項

  • 單例會產生全域狀態,導致單元測試困難、依賴隱性化。
  • 若無真正需要「全域唯一」,優先考慮依賴注入(DI)容器管理共享實例。

多例模式

特點

  • getInstance($key) 接受鍵值參數。
  • 相同鍵值回傳同一實例,不同鍵值回傳不同實例。
  • 適用於多租戶、多節點、多配置檔等場景。

程式碼範例

<?php
class MultitonExample {
    private function __construct() {}
    public static function getInstance($key) {
        static $instances = array();
        if (!array_key_exists($key, $instances)) {
            $instances[$key] = new MultitonExample(); // 此處原文有誤,應為 new self()
        }
        return $instances[$key];
    }
}
// 使用
$db1 = MultitonExample::getInstance('db_master');
$db2 = MultitonExample::getInstance('db_slave');
$db3 = MultitonExample::getInstance('db_master');
var_dump($db1 === $db3); // true
var_dump($db1 === $db2); // false
?>

比較總結

特性單例多例
實例數量全域唯一每鍵值唯一
獲取方式getInstance()getInstance($key)
典型場景配置、連線池、日誌多資料庫、多租戶、多語系
記憶體佔用極低隨鍵值增長

最佳實踐建議

  1. 謹慎使用單例/多例,優先評估是否可由 DI 容器管理生命週期。
  2. 若必須使用,建議加上 final 關鍵字防止繼承破壞模式。
  3. 多執行緒環境(如 Swoole、RoadRunner)下需加鎖或使用靜態區域變數確保線程安全。
  4. 提供 resetInstance() 方法方便測試時重置狀態。

理解單例與多例的核心差異,能幫助你在架構設計中做出更合理的選擇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved