PHP 單例模式

單例模式,是一種經常使用的軟件設計模式。在它的核心結構中只包含一個被稱爲單例的特殊類。經過單例模式能夠保證系統中,應用該模式的類一個類只有一個實例。即一個類只有一個對象實例數據庫

好比在某個服務器程序中,該服務器的配置信息存放在一個文件中,這些配置數據由一個單例對象統一讀取,而後服務進程中的其餘對象再經過這個單例對象獲取這些配置信息。這種方式簡化了在複雜環境下的配置管理。設計模式


對於系統中的某些類來講,只有一個實例很重要,例如,一個系統中能夠存在多個打印任務,可是隻能有一個正在工做的任務;一個系統只能有一個窗口管理器或文件系統;一個系統只能有一個計時工具或ID(序號)生成器。如在Windows中就只能打開一個任務管理器。若是不使用機制對窗口對象進行惟一化,將彈出多個窗口,若是這些窗口顯示的內容徹底一致,則是重複對象,浪費內存資源;若是這些窗口顯示的內容不一致,則意味着在某一瞬間系統有多個狀態,與實際不符,也會給用戶帶來誤解,不知道哪個纔是真實的狀態。所以有時確保系統中某個對象的惟一性即一個類只能有一個實例很是重要。 [3]
如何保證一個類只有一個實例而且這個實例易於被訪問呢?定義一個全局變量能夠確保對象隨時均可以被訪問,但不能防止咱們實例化多個對象。一個更好的解決辦法是讓類自身負責保存它的惟一實例。這個類能夠保證沒有其餘實例被建立,而且它能夠提供一個訪問該實例的方法。這就是單例模式的模式動機。服務器


顯然單例模式的要點有三個;一是某個類只能有一個實例;二是它必須自行建立這個實例;三是它必須自行向整個系統提供這個實例。
從具體實現角度來講,就是如下三點:一是單例模式的類只提供私有的構造函數,二是類定義中含有一個該類的靜態私有對象,三是該類提供了一個靜態的公有的函數用於建立或獲取它自己的靜態私有對象。
在下面的對象圖中,有一個"單例對象",而"客戶甲"、"客戶乙" 和"客戶丙"是單例對象的三個客戶對象。能夠看到,全部的客戶對象共享一個單例對象。並且從單例對象到自身的鏈接線能夠看出,單例對象持有對本身的引用。函數

class test {
private static $_instance;//保存類實例的私有靜態成員變量
//定義一個私有的構造函數,確保單例類不能經過new關鍵字實例化,只能被其自身實例化
private final function __construct() {
echo 'test __construct';
}
//定義私有的__clone()方法,確保單例類不能被複制或克隆
private function __clone() {}
public static function getInstance() {
//檢測類是否被實例化
if ( ! (self::$_instance instanceof self) ) {
self::$_instance = new test();
}
return self::$_instance;
}
}
//調用單例類
test::getInstance();

優勢

系統內存中該類只存在一個對象,節省了系統資源,對於一些須要頻繁建立銷燬的對象,使用單例模式能夠提升系統性能。工具

缺點

當想實例化一個單例類的時候,必需要記住使用相應的獲取對象的方法,而不是使用new,可能會給其餘開發人員形成困擾,特別是看不到源碼的時候。性能

適用場合

  • 須要頻繁的進行建立和銷燬的對象;
  • 建立對象時耗時過多或耗費資源過多,但又常常用到的對象;
  • 工具類對象;
  • 頻繁訪問數據庫或文件的對象。
相關文章
相關標籤/搜索