單例模式確保一個類只有一個實例,並提供全域存取點;多例模式則允許針對不同鍵值擁有多個唯一實例。本文解析兩者在 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,同一個實例
?>
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) |
| 典型場景 | 配置、連線池、日誌 | 多資料庫、多租戶、多語系 |
| 記憶體佔用 | 極低 | 隨鍵值增長 |
final 關鍵字防止繼承破壞模式。resetInstance() 方法方便測試時重置狀態。理解單例與多例的核心差異,能幫助你在架構設計中做出更合理的選擇。