PHP設(shè)計模式之單例模式定義與用法分析
本文實例分析了PHP設(shè)計模式之單例模式。分享給大家供大家參考,具體如下:
單例模式(Singleton Pattern 單件模式或單元素模式),是常見的一種設(shè)計模式,它有三個特點
- 1.只能有一個實例
- 2.必須自行創(chuàng)建這個實例
- 3.必須給其他對象提供這一實例
下面用PHP代碼實現(xiàn)一下
<?PHP /** * Created by PHPStorm. * User: tiansi * Date: 18/1/2 * Time: 下午3:40 */ class Signleton{ private static $_instanse = null; //私有化構(gòu)造方法 防止外界使用new實例化對象 private function __construct() { } //私有化克隆方法 防止外界克隆對象 private function __clone() { // TODO: Implement __clone() method. } //靜態(tài)化 提供單例訪問入口 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'; } }
下面試一下調(diào)用
<?PHP /** * Created by PHPStorm. * User: tiansi * Date: 18/1/2 * Time: 下午3:48 */ //第一種方式會報錯 因為把構(gòu)造方法私有化了 //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();
運行結(jié)果:
I am signleton
它的優(yōu)缺點
優(yōu)點:
- 1.在單例模式中,活動的單例只有一個實例,對單例類的所有實例化得到的都是相同的一個實例。這樣就 防止其它對象對自己的實例化,確保所有的對象都訪問一個實例
- 2.單例模式具有一定的伸縮性,類自己來控制實例化進程,類就在改變實例化進程上有相應(yīng)的伸縮性。
- 3.提供了對唯一實例的受控訪問。
- 4.由于在系統(tǒng)內(nèi)存中只存在一個對象,因此可以 節(jié)約系統(tǒng)資源,當 需要頻繁創(chuàng)建和銷毀的對象時單例模式無疑可以提高系統(tǒng)的性能。
- 5.允許可變數(shù)目的實例。
- 6.避免對共享資源的多重占用。
缺點:
- 1.不適用于變化的對象,如果同一類型的對象總是要在不同的用例場景發(fā)生變化,單例就會引起數(shù)據(jù)的錯誤,不能保存彼此的狀態(tài)。
- 2.由于單利模式中沒有抽象層,因此單例類的擴展有很大的困難。
- 3.單例類的職責過重,在一定程度上違背了“單一職責原則”。
- 4.濫用單例將帶來一些負面問題,如為了節(jié)省資源將數(shù)據(jù)庫連接池對象設(shè)計為的單例類,可能會導(dǎo)致共享連接池對象的程序過多而出現(xiàn)連接池溢出;如果實例化的對象長時間不被利用,系統(tǒng)會認為是垃圾而被回收,這將導(dǎo)致對象狀態(tài)的丟失。
這是單例模式的優(yōu)缺點,因為語言類型的不同,PHP的單例模式又不一樣
眾所周知,PHP語言是一種解釋型的腳本語言,這種運行機制使得每個PHP頁面被解釋執(zhí)行后,所有的相關(guān)資源都會被回收。也就是說,PHP在語言級別上沒有辦法讓某個對象常駐內(nèi)存,這和asp.net、Java等編譯型是不同的,比如在Java中單例會一直存在于整個應(yīng)用程序的生命周期里,變量是跨頁面級的,真正可以做到這個實例在應(yīng)用程序生命周期中的唯一性。然而在PHP中,所有的變量無論是全局變量還是類的靜態(tài)成員,都是頁面級的,每次頁面被執(zhí)行時,都會重新建立新的對象,都會在頁面執(zhí)行完畢后被清空,這樣似乎PHP單例模式就沒有什么意義了,所以PHP單例模式我覺得只是針對單次頁面級請求時出現(xiàn)多個應(yīng)用場景并需要共享同一對象資源時才有用
比如
1.應(yīng)用程序與數(shù)據(jù)庫交互
一個應(yīng)用中會存在大量的數(shù)據(jù)庫操作,比如過數(shù)據(jù)庫句柄來連接數(shù)據(jù)庫這一行為,使用單例模式可以避免大量的new
操作,因為每一次new操作都會消耗內(nèi)存資源和系統(tǒng)資源。
2.控制配置信息
如果系統(tǒng)中需要有一個類來全局控制某些配置信息, 那么使用單例模式可以很方便的實現(xiàn)
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運算與運算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對大家PHP程序設(shè)計有所幫助。
相關(guān)文章
PHP中l(wèi)trim與rtrim去除左右空格及特殊字符實例
這篇文章主要介紹了PHP中l(wèi)trim與rtrim去除左右空格及特殊字符的用法,結(jié)合實例形式較為詳細的說明了ltrim與rtrim的定義,參數(shù)作用及去除左右空格與特殊字符的使用技巧,需要的朋友可以參考下2016-01-01Zend Studio for Eclipse的java.lang.NullPointerException錯誤的解決方
Zend Studio for Eclipse 6.x 可以算得上是最好的PHP的IDE了.2008-12-12php將數(shù)據(jù)庫導(dǎo)出成excel的方法
有時寫程序時后臺要求把大量數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫中,比如考試成績、電話簿等一般都是存放在excel中的數(shù)據(jù),這時我們可把excel導(dǎo)出成csv文件,然后通過以下程序即可批量導(dǎo)入數(shù)據(jù)到數(shù)據(jù)庫中2010-05-05