国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

PHP設計模式之單例模式定義與用法分析

2024-05-05 00:07:58
字體:
來源:轉載
供稿:網友

本文實例分析了PHP設計模式之單例模式。分享給大家供大家參考,具體如下:

單例模式(Singleton Pattern 單件模式或單元素模式),是常見的一種設計模式,它有三個特點

  • 1.只能有一個實例
  • 2.必須自行創建這個實例
  • 3.必須給其他對象提供這一實例

下面用PHP代碼實現一下

<?PHP/** * Created by PHPStorm. * User: tiansi * Date: 18/1/2 * Time: 下午3:40 */class Signleton{  private static $_instanse = null;  //私有化構造方法 防止外界使用new實例化對象  private function __construct()  {  }  //私有化克隆方法 防止外界克隆對象  private function __clone()  {    // TODO: Implement __clone() method.  }  //靜態化 提供單例訪問入口  static function getInstance(){    if (is_null(self::$_instanse) || !isset(self::$_instanse)){      self::$_instanse = new self();    }    return self::$_instanse;  }  public function say(){    echo 'I am signleton';  }}

下面試一下調用

<?PHP/** * Created by PHPStorm. * User: tiansi * Date: 18/1/2 * Time: 下午3:48 *///第一種方式會報錯 因為把構造方法私有化了//PHP Fatal error: Uncaught Error: Call to private Signleton::__construct() from invalid context in /Users/apple/uxin/SignletonController.PHP:11/*$signleton1 = new Signleton();$signleton1->say();*///上述代碼報錯:Fatal error: Call to private Signleton::__construct() //實例化成功 輸出I am signleton$signleton2 = Signleton::getInstance();$signleton2->say();

運行結果:

I am signleton

它的優缺點

優點:

  • 1.在單例模式中,活動的單例只有一個實例,對單例類的所有實例化得到的都是相同的一個實例。這樣就 防止其它對象對自己的實例化,確保所有的對象都訪問一個實例
  • 2.單例模式具有一定的伸縮性,類自己來控制實例化進程,類就在改變實例化進程上有相應的伸縮性。
  • 3.提供了對唯一實例的受控訪問。
  • 4.由于在系統內存中只存在一個對象,因此可以 節約系統資源,當 需要頻繁創建和銷毀的對象時單例模式無疑可以提高系統的性能。
  • 5.允許可變數目的實例。
  • 6.避免對共享資源的多重占用。

缺點:

  • 1.不適用于變化的對象,如果同一類型的對象總是要在不同的用例場景發生變化,單例就會引起數據的錯誤,不能保存彼此的狀態。
  • 2.由于單利模式中沒有抽象層,因此單例類的擴展有很大的困難。
  • 3.單例類的職責過重,在一定程度上違背了“單一職責原則”。
  • 4.濫用單例將帶來一些負面問題,如為了節省資源將數據庫連接池對象設計為的單例類,可能會導致共享連接池對象的程序過多而出現連接池溢出;如果實例化的對象長時間不被利用,系統會認為是垃圾而被回收,這將導致對象狀態的丟失。

這是單例模式的優缺點,因為語言類型的不同,PHP的單例模式又不一樣

眾所周知,PHP語言是一種解釋型的腳本語言,這種運行機制使得每個PHP頁面被解釋執行后,所有的相關資源都會被回收。也就是說,PHP在語言級別上沒有辦法讓某個對象常駐內存,這和asp.net、Java等編譯型是不同的,比如在Java中單例會一直存在于整個應用程序的生命周期里,變量是跨頁面級的,真正可以做到這個實例在應用程序生命周期中的唯一性。然而在PHP中,所有的變量無論是全局變量還是類的靜態成員,都是頁面級的,每次頁面被執行時,都會重新建立新的對象,都會在頁面執行完畢后被清空,這樣似乎PHP單例模式就沒有什么意義了,所以PHP單例模式我覺得只是針對單次頁面級請求時出現多個應用場景并需要共享同一對象資源時才有用

比如

1.應用程序與數據庫交互

一個應用中會存在大量的數據庫操作,比如過數據庫句柄來連接數據庫這一行為,使用單例模式可以避免大量的new操作,因為每一次new操作都會消耗內存資源和系統資源。

2.控制配置信息

如果系統中需要有一個類來全局控制某些配置信息, 那么使用單例模式可以很方便的實現

希望本文所述對大家PHP程序設計有所幫助。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 合阳县| 英吉沙县| 张家川| 尖扎县| 鄄城县| 遂昌县| 荥经县| 荆门市| 元谋县| 河曲县| 沂源县| 炎陵县| 万宁市| 温宿县| 呈贡县| 开封市| 涟水县| 东丽区| 凤庆县| 中超| 枣阳市| 鹤岗市| 永登县| 长春市| 武威市| 松阳县| 峡江县| 宝兴县| 上蔡县| 石门县| 闽侯县| 余江县| 石棉县| 响水县| 汤阴县| 无锡市| 灵宝市| 宁都县| 兰西县| 黄梅县| 澄迈县|