單例模式確保類別在 JVM/進程中**只有一個實例**,提供全域存取點。
public class Singleton {
private static volatile Singleton instance;
private Singleton() {} // 私有建構子
public static Singleton getInstance() {
if (instance == null) { // 第一次檢查 (無鎖)
synchronized (Singleton.class) { // 同步鎖
if (instance == null) { // 第二次檢查
instance = new Singleton();
}
}
}
return instance;
}
// 防止反射破解、序列化破解可加入 readResolve() 等
}
public class Demo {
public static void main(String[] args) {
Singleton s1 = Singleton.getInstance();
s1.num = 2;
Singleton s2 = Singleton.getInstance(); // 不會重新建立
System.out.println(s2.num); // 2,同一物件
}
}
<?php
class Singleton {
private static $instance;
public $num = 1;
private function __construct() {}
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new Singleton();
echo "對象只有一個\n";
}
return self::$instance;
}
// 防止 clone 建立新實例
private function __clone() {}
}
$obj1 = Singleton::getInstance();
$obj1->num = 2;
$obj2 = Singleton::getInstance(); // 只輸出一次 "對象只有一個"
echo $obj2->num; // 2
?>
private,禁止外部 new。getInstance() 回傳實例。volatile + DCL;PHP 單線程無此問題)。__clone、__wakeup 防序列化繞過。