您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)PHP中怎么實(shí)現(xiàn)單例模式,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
單例模式,是一種常用的軟件設(shè)計(jì)模式,在它的核心結(jié)構(gòu)中只包含一個(gè)被稱為單例的特殊類。通過單例模式可以保證系統(tǒng)中一個(gè)類只有一個(gè)實(shí)例,即一個(gè)類只有一個(gè)對(duì)象實(shí)例。通俗來講就是通過提供自身共享實(shí)例的訪問,單例設(shè)計(jì)模式用于限制特定對(duì)象只能被創(chuàng)建一次,來看下這個(gè)單例模式的要點(diǎn):
1.一個(gè)類只能有一個(gè)對(duì)象;
2.必須是自行創(chuàng)建這個(gè)類的對(duì)象;
3,要想整個(gè)系統(tǒng)提供這一個(gè)對(duì)象;
從具體實(shí)現(xiàn)的角度來說,可以按著下面這三點(diǎn)來理解:
一是單例模式的類只提供私有的構(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ì)象都訪問唯一實(shí)例。
二、靈活性
因?yàn)轭惪刂屏藢?shí)例化過程,所以類可以靈活更改實(shí)例化過程。
缺點(diǎn)如下:
一、開銷
雖然數(shù)量很少,但如果每次對(duì)象請(qǐng)求引用時(shí)都要檢查是否存在類的實(shí)例,將仍然需要一些開銷??梢酝ㄟ^使用靜態(tài)初始化解決此問題。
二、可能的開發(fā)混淆
使用單例對(duì)象(尤其在類庫(kù)中定義的對(duì)象)時(shí),開發(fā)人員必須記住自己不能使用new關(guān)鍵字實(shí)例化對(duì)象。因?yàn)榭赡軣o法訪問庫(kù)源代碼,因此應(yīng)用程序開發(fā)人員可能會(huì)意外發(fā)現(xiàn)自己無法直接實(shí)例化此類。
三、對(duì)象生存期
不能解決刪除單個(gè)對(duì)象的問題。在提供內(nèi)存管理的語(yǔ)言中(例如基于.NET Framework的語(yǔ)言),只有單例類能夠?qū)е聦?shí)例被取消分配,因?yàn)樗瑢?duì)該實(shí)例的私有引用。在某些語(yǔ)言中(如 C++),其他類可以刪除對(duì)象實(shí)例,但這樣會(huì)導(dǎo)致單例類中出現(xiàn)懸浮引用。
來看下咱寫的案例 :
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并沒有創(chuàng)建對(duì)象,而是直接使用$instance保存的唯一對(duì)象,所以輸出的參數(shù)并沒有變?yōu)?quot;luyaran","27"。
關(guān)于PHP中怎么實(shí)現(xiàn)單例模式就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。