PHP單例模式(Singleton Pattern)

前言:單例模式顧名思義,就是隻有一個實例。作為對象的創建模式,單例模式確保某一個類在程序運行過程中只有一個實例。

為什麼要使用PHP單例模式

1,php的應用主要在於web和數據庫交互應用, 一個應用中會存在大量的數據庫操作, 在使用面向對象的方式開發時,如果使用單例模式,則可以避免大量的new操作消耗的資源,還可以減少數據庫連接這樣就不容易出現 too many connections情況。

2,如果系統中需要有一個類來全局控制某些配置信息, 那麼使用單例模式可以很方便的實現. 這個可以參看zend Framework的FrontController部分。

3,在一次頁面請求中, 便於進行調試, 因為所有的代碼(例如數據庫操作類db)都集中在一個類中, 我們可以在類中設置鉤子, 輸出日誌,從而避免到處用var_dump, echo來輸出日誌。

單例模式優點及使用場景

  1. 由於單例模式在內存中只有一個實例,減少了內存開支,特別是一個對象需要頻繁地創建、銷燬時,而且創建或銷燬時性能有無法優化,單例模式的優勢就非常明顯。
  2. 由於單例模式只生成一個實例,所以減少了系統的性能開銷,當一個對象的產生需要較多的資源時,如讀取配置,產生其他依賴對象時,則可以通過在應用啟動時直接產生一個單例對象,然後永久駐留內存的方式來解決。
  3. 單例模式可以避免對資源的多重佔用,例如一個寫文件動作,由於只有一個實例存在內存中,避免對同一個資源文件的同時寫操作。
  4. 單例模式可以在系統設置全局變量的訪問點,優化和共享資源訪問,例如可以設計一個單例類,負責所有數據表的映射處理。

單例模式的實現

  1. 私有化一個屬性用於存放唯一的一個實例
  2. 私有化構造方法,私有化克隆方法,用來創建並只允許創建一個實例
  3. 公有化靜態方法,用於向系統提供這個實例

代碼實現(方法一)

優點:因為靜態方法可以在全局範圍內被訪問,當我們需要一個單例模式的對象時,只需調用getInstance方法,獲取先前實例化的對象,無需重新實例化,代碼如下:

PHP單例模式(Singleton Pattern)

代碼截圖

運行結果

從以下結果圖中可以看到,代碼兩次getInstance(),構造方法只執行了一次,也就是說只創建了一個類的對象。

PHP單例模式(Singleton Pattern)

運行結果

使用Trait關鍵字實現類似於繼承單例類的功能

特別說明強調一個知識點:父類方法為public,則子類只能為pubic,若父類為private,子類為public ,protected,private都可以(此處是繼承特性)

PHP單例模式(Singleton Pattern)

Trait關鍵字實現

執行結果

從以下結果圖中可以看到,運行效果和第一種方法是一致的,也實現了單例效果。

PHP單例模式(Singleton Pattern)

Trait關鍵字運行結果

擴展部分

基本上單例模式,都會講三私一公,公優化靜態方法作為提供對象的接口,私有屬性用於存放唯一一個單例對象。私有化構造方法,私有化克隆方法保證只存在一個單例。

但實際上,雖然我們無法通過new關鍵字和clone出一個新的對象,但我們若想得到一個新對象。還是有辦法的,那就是通過序列化和反序列化得到一個對象。


分享到:


相關文章: