PHP設(shè)計(jì)模式之單例模式入門與應(yīng)用詳解
本文實(shí)例講述了PHP設(shè)計(jì)模式之單例模式入門與應(yīng)用。分享給大家供大家參考,具體如下:
單例模式,是一種常用的軟件設(shè)計(jì)模式,在它的核心結(jié)構(gòu)中只包含一個(gè)被稱為單例的特殊類。通過(guò)單例模式可以保證系統(tǒng)中一個(gè)類只有一個(gè)實(shí)例,即一個(gè)類只有一個(gè)對(duì)象實(shí)例。通俗來(lái)講就是通過(guò)提供自身共享實(shí)例的訪問(wèn),單例設(shè)計(jì)模式用于限制特定對(duì)象只能被創(chuàng)建一次,來(lái)看下這個(gè)單例模式的要點(diǎn):
1.一個(gè)類只能有一個(gè)對(duì)象;
2.必須是自行創(chuàng)建這個(gè)類的對(duì)象;
3,要想整個(gè)系統(tǒng)提供這一個(gè)對(duì)象;
從具體實(shí)現(xiàn)的角度來(lái)說(shuō),可以按著下面這三點(diǎn)來(lái)理解:
一是單例模式的類只提供私有的構(gòu)造函數(shù),
二是類定義中含有一個(gè)該類的靜態(tài)私有對(duì)象,
三是該類提供了一個(gè)靜態(tài)的公有的函數(shù)用于創(chuàng)建或獲取它本身的靜態(tài)私有對(duì)象。
最主要的就是還要有一個(gè)private的clone方法,防止克隆,得記得哈。
優(yōu)點(diǎn)如下:
一、實(shí)例控制
單例模式會(huì)阻止其他對(duì)象實(shí)例化其自己的單例對(duì)象的副本,從而確保所有對(duì)象都訪問(wèn)唯一實(shí)例。
二、靈活性
因?yàn)轭惪刂屏藢?shí)例化過(guò)程,所以類可以靈活更改實(shí)例化過(guò)程。
缺點(diǎn)如下:
一、開(kāi)銷
雖然數(shù)量很少,但如果每次對(duì)象請(qǐng)求引用時(shí)都要檢查是否存在類的實(shí)例,將仍然需要一些開(kāi)銷。可以通過(guò)使用靜態(tài)初始化解決此問(wèn)題。
二、可能的開(kāi)發(fā)混淆
使用單例對(duì)象(尤其在類庫(kù)中定義的對(duì)象)時(shí),開(kāi)發(fā)人員必須記住自己不能使用new關(guān)鍵字實(shí)例化對(duì)象。因?yàn)榭赡軣o(wú)法訪問(wèn)庫(kù)源代碼,因此應(yīng)用程序開(kāi)發(fā)人員可能會(huì)意外發(fā)現(xiàn)自己無(wú)法直接實(shí)例化此類。
三、對(duì)象生存期
不能解決刪除單個(gè)對(duì)象的問(wèn)題。在提供內(nèi)存管理的語(yǔ)言中(例如基于.NET Framework的語(yǔ)言),只有單例類能夠?qū)е聦?shí)例被取消分配,因?yàn)樗瑢?duì)該實(shí)例的私有引用。在某些語(yǔ)言中(如 C++),其他類可以刪除對(duì)象實(shí)例,但這樣會(huì)導(dǎo)致單例類中出現(xiàn)懸浮引用。
來(lái)看下咱寫(xiě)的案例 :
class Test{ static private $instance; private $age; private $name; private function __construct($name,$age) { $this->name = $name; $this->age = $age; echo "construct".PHP_EOL; } private function __clone() { // TODO: Implement __clone() method. } static public function set_name($name,$age) { if (!self::$instance instanceof self) { self::$instance = new self($name,$age); } return self::$instance; } public function get_name() { echo $this -> name.PHP_EOL; echo $this -> age.PHP_EOL; } } $object_1 = Test::set_name("cuijinpeng","26"); $object_1->get_name(); echo "<br>"; $object_2 = Test::set_name("luyaran","27"); $object_2->get_name();
運(yùn)行結(jié)果:
construct cuijinpeng 26
cuijinpeng 26
從上述實(shí)例中,我們可以看出,$object_1創(chuàng)建對(duì)象后,參數(shù)是"cuijinpeng","26",但是$object_2并沒(méi)有創(chuàng)建對(duì)象,而是直接使用$instance保存的唯一對(duì)象,所以輸出的參數(shù)并沒(méi)有變?yōu)?luyaran","27"。
好啦,本次記錄就到這里了。
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語(yǔ)法入門教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
- 一文帶你搞懂PHP單例模式
- php的單例模式及應(yīng)用場(chǎng)景詳解
- PHP實(shí)現(xiàn)單例模式建立數(shù)據(jù)庫(kù)連接的方法分析
- php設(shè)計(jì)模式之單例模式用法經(jīng)典示例分析
- PHP單例模式實(shí)例分析【防繼承,防克隆操作】
- PHP設(shè)計(jì)模式之單例模式定義與用法分析
- PHP單例模式數(shù)據(jù)庫(kù)連接類與頁(yè)面靜態(tài)化實(shí)現(xiàn)方法
- PHP中單例模式的使用場(chǎng)景與使用方法講解
- PHP單例模式Singleton Pattern的原理與實(shí)現(xiàn)介紹
相關(guān)文章
ThinkPHP框架中使用Memcached緩存數(shù)據(jù)的方法
這篇文章主要介紹了ThinkPHP框架中使用Memcached緩存數(shù)據(jù)的方法,結(jié)合實(shí)例形式分析了thinkPHP框架中Memcached緩存的設(shè)置與使用相關(guān)操作技巧,需要的朋友可以參考下2018-03-03php中使用Ajax時(shí)出現(xiàn)Error(c00ce56e)的詳細(xì)解決方案
php中使用Ajax時(shí)出現(xiàn)Error: 由于出現(xiàn)錯(cuò)誤 c00ce56e 而導(dǎo)致此項(xiàng)操作無(wú)法完成,本文討論一下各版本之間ajax兼容性造成錯(cuò)誤的解決方法2014-11-11新版php?study根目錄下文件夾無(wú)法顯示的圖文解決方法
這篇文章主要介紹了新版php?study根目錄下文件夾無(wú)法顯示解決方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12safari下載文件自動(dòng)加了html后綴問(wèn)題
這篇文章主要介紹了safari下載文件自動(dòng)加了html后綴問(wèn)題,本文給大家提到了下載文件的兩種方法,需要的朋友可以參考下2018-11-11ThinkPHP2.0讀取MSSQL提示Incorrect syntax near the keyword ''AS''
這篇文章主要介紹了ThinkPHP2.0讀取MSSQL提示Incorrect syntax near the keyword 'AS'的解決方法,需要的朋友可以參考下2014-06-06使用xampp搭建運(yùn)行php虛擬主機(jī)的詳細(xì)步驟
這篇文章主要介紹了通過(guò)使用xampp搭建運(yùn)行php虛擬主機(jī)的步驟,介紹很詳細(xì),感興趣的小伙伴們可以參考一下2015-10-10PHP網(wǎng)頁(yè)游戲?qū)W習(xí)之Xnova(ogame)源碼解讀(十四)
這篇文章主要介紹了PHP網(wǎng)頁(yè)游戲Xnova(ogame)源碼解讀的資源更新頁(yè)面部分,需要的朋友可以參考下2014-06-06