PHP之單例模式

閏了個土發表於2018-05-22

圖片來自:http://www.ngchina.com.cn/
圖片來自:http://www.ngchina.com.cn

單例模式:也叫單態模式(好像各個地方都是叫單例!),是一種常用的軟體設計模式。這個模式規定單例物件的類必須保證這個類只能有一個例項的存在,並提供一個訪問它的全域性訪問點 ( 就算new,也只能讓你new一個物件,畢竟國內是一夫一妻制 )

應用場景:

  • 資料庫聯結器
  • 日誌程式(一般都是採用單例模式)
  • 配置物件
  • 多執行緒的執行緒池
  • 等等......

由於這個東西不是什麼新奇的玩意,我就結合高手的和我自己的理解例項說明下這個東西怎麼玩:

一切程式碼中解釋

// 私有化
class test
{
    // 完全私有化這個建構函式,就不讓你用
    private function __construct()
    {
        // 
    }
}

// 暴露一個介面給外部訪問
class test
{
    private function __construct()
    {
        // 
    }
    public static function getInstance()
    {
        //
    }
}
// 返還物件
class test
{
    private function __construct()
    {
        // 
    }
    public static function getInstance()
    {
        return new test(); // 要物件?沒關係國家給發
    }
}
// 判斷唯一性
class test
{
    private function __construct()
    {
        // 
    }
    public static function getInstance()
    {
        $obj = ""
        if(empty($obj) // 是不是領過物件了?
        {
            $obj = new test(); 
        }
        return $obj;
    }
}
// 設定靜態:雖然數量很少,但如果每次物件請求引用時都要檢查是否存在類的例項,將仍然需要一些開銷
class test
{
    private static $obj; // 私密的

    private function __construct()
    {
        // 
    }
    public static function getInstance()
    {
        if(empty(self::$obj))
        {
            self::$obj = new test(); 
        }
        return self::$obj;
    }
}
// 防止克隆

class test
{
    private static $obj; // 私密的
    
    private function __construct()
    {
        // 
    }
    // 暴露給外部, getInstance算是一個小規範
    public static function getInstance()
    {
       /* 用一個靜態變數儲存的例項,
        * 只有第一次例項化的時候才賦值,
        */ 以後都直接給出靜態示例
        if(empty(self::$obj))
        {
            self::$obj = new test(); 
        }
        return self::$obj; // 返回原配
    }
    // 根據法律龜腚 禁止克隆物件
    private __clone()
    {
        // 
    }
}
$t1 = test::getInstance(); // 獲取這個例項化物件
$t2 = test::getInstance();
var_dump($t1===$t2);  // true
複製程式碼

有什麼不對的地方還請大神指正,也歡迎提問

寫於:2018年5月20日 參考資料:

百度百科

維基百科

網友部落格

相關文章