首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

單例設計模式 Java 與 PHP 實現:私有建構子、靜態實例、雙重檢查與防克隆

     編輯:Java 綜合教學

單例設計模式 Java 與 PHP 實現

單例模式確保類別在 JVM/進程中**只有一個實例**,提供全域存取點。

Java 經典實現 (懶漢式 + 雙重檢查鎖)

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 實現 (含防克隆)

<?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
?>

關鍵要素

  1. 建構子 private,禁止外部 new。
  2. 靜態私有欄位持有唯一實例。
  3. 公開靜態工廠方法 getInstance() 回傳實例。
  4. 多線程環境需同步 (Java volatile + DCL;PHP 單線程無此問題)。
  5. PHP 需額外禁用 __clone、__wakeup 防序列化繞過。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved