摘要:?jiǎn)卫O(shè)計(jì)模式的特點(diǎn)在用戶(hù)量大的應(yīng)用中會(huì)存在大量的數(shù)據(jù)庫(kù)操作使用單例模式則可以避免大量的操作消耗的資源。使用單例設(shè)計(jì)模式,可以全局控制某些配置信息,方便調(diào)試,單例設(shè)計(jì)模式只有一個(gè)入口,所有的代碼都集中在一個(gè)類(lèi)中,定位問(wèn)題簡(jiǎn)單。
單例設(shè)計(jì)模式的特點(diǎn):
1、在用戶(hù)量大的應(yīng)用中會(huì)存在大量的數(shù)據(jù)庫(kù)操作, 使用單例模式, 則可以避免大量的new 操作消耗的資源。
2、使用單例設(shè)計(jì)模式,可以全局控制某些配置信息,方便調(diào)試,單例設(shè)計(jì)模式只有一個(gè)入口,所有的代碼都集中在一個(gè)類(lèi)中,定位問(wèn)題簡(jiǎn)單。
單例模式的特點(diǎn):
1、一個(gè)類(lèi)只能有一個(gè)類(lèi)對(duì)象(只能實(shí)例化一個(gè)對(duì)象)
2、它必須自己創(chuàng)建這個(gè)實(shí)例
3、它必須自行向整個(gè)系統(tǒng)提供這個(gè)實(shí)例
4、構(gòu)造函數(shù)和克隆函數(shù)必須聲明為私有的,這是為了防止外部程序 new 類(lèi)從而失去單例模式的意義
5、 getInstance()方法必須聲明為公有的,必須調(diào)用此方法以返回唯一實(shí)例的一個(gè)引用
6、擁有一個(gè)保存類(lèi)的實(shí)例的靜態(tài)成員變量
7、PHP的單例模式是相對(duì)而言的,因?yàn)镻HP的解釋運(yùn)行機(jī)制使得每個(gè)PHP頁(yè)面被解釋執(zhí)行后,所有的相關(guān)資源都會(huì)被回收
8、擁有一個(gè)訪問(wèn)這個(gè)實(shí)例的公共的靜態(tài)方法(常用getInstance()方法進(jìn)行實(shí)例化單例類(lèi),通過(guò)instanceof操作符可以檢測(cè)到類(lèi)是否已經(jīng)被實(shí)例化)
另外,需要?jiǎng)?chuàng)建__clone()方法防止對(duì)象被復(fù)制(克隆)
class Redis { /** * 實(shí)例化的對(duì)象,單例模式. * @var iphpdbRedis */ static private $_instance= array(); private function __construct($config,$attr=array()) { if ( !extension_loaded("redis") ) { E(L("_NOT_SUPPORT_").":redis"); } $this->attr = array_merge($this->attr,$attr); $this->port = $config["REDIS_PORT"] ? $config["REDIS_PORT"] : 6379; $this->host = $config["DB_HOST"]; $this->redis = new Redis(); $this->redis->connect($this->host, $this->port, $this->attr["timeout"]); if($config["auth"]) { $this->auth($config["auth"]); $this->auth = $config["auth"]; } $this->expireTime = time() + $this->attr["timeout"]; } /** * 得到靜態(tài)實(shí)例化的對(duì)象. * 為每個(gè)數(shù)據(jù)庫(kù)建立一個(gè)連接 * 如果連接超時(shí),將會(huì)重新建立一個(gè)連接 */ public static function getInstance($config,$attr=array()) { if(!self::$_instance || !(self::$_instance instanceof self)){ self::$_instance = new self($config,$attr=array()); } return self::$_instance; } // 靜止被克隆 private function __clone(){} }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/30086.html
摘要:總結(jié)單例是運(yùn)用頻率很高的模式,因?yàn)榭蛻?hù)端沒(méi)有高并發(fā)的情況,選擇哪種方式并不會(huì)有太大的影響,出于效率考慮,推薦使用和靜態(tài)內(nèi)部類(lèi)實(shí)現(xiàn)單例模式。 單例模式介紹 單例模式是應(yīng)用最廣的模式之一,也可能是很多人唯一會(huì)使用的設(shè)計(jì)模式。在應(yīng)用單例模式時(shí),單例對(duì)象的類(lèi)必須保證只用一個(gè)實(shí)例存在。許多時(shí)候整個(gè)系統(tǒng)只需要一個(gè)全局對(duì)象,這樣有利于我么能協(xié)調(diào)整個(gè)系統(tǒng)整體的行為。 單例模式的使用場(chǎng)景 確保某個(gè)類(lèi)有且...
摘要:不符合設(shè)計(jì)模式中的單一職責(zé)的概念。引入代理實(shí)現(xiàn)單例模式引入代理實(shí)現(xiàn)單例模式的特點(diǎn)我們負(fù)責(zé)管理單例的邏輯移到了代理類(lèi)中。的單例模式對(duì)比在以上的代碼中實(shí)現(xiàn)的單例模式都混入了傳統(tǒng)面向?qū)ο笳Z(yǔ)言的特點(diǎn)。 聲明:這個(gè)系列為閱讀《JavaScript設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐》 ----曾探@著一書(shū)的讀書(shū)筆記 1.單例模式的特點(diǎn)和定義 保證一個(gè)類(lèi)僅有一個(gè)實(shí)例,并且提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)。 2.傳統(tǒng)面向?qū)?..
摘要:?jiǎn)卫J礁攀鰡卫J绞且环N對(duì)象創(chuàng)建模式,用于產(chǎn)生一個(gè)類(lèi)的具體事例。所以解決了線程安全問(wèn)題參考失效原因和解決方案中單例模式的缺陷及單例的正確寫(xiě)法懶漢式靜態(tài)內(nèi)部類(lèi)私有構(gòu)造器獲取單例的方法靜態(tài)內(nèi)部類(lèi)持有單例作為靜態(tài)屬性。 單例模式概述 單例模式是一種對(duì)象創(chuàng)建模式,用于產(chǎn)生一個(gè)類(lèi)的具體事例。使用單例模式可以確保整個(gè)系統(tǒng)中單例類(lèi)只產(chǎn)生一個(gè)實(shí)例。有下面兩大好處: 對(duì)于頻繁創(chuàng)建的對(duì)象,節(jié)省初第一...
摘要:如果需要防范這種攻擊,請(qǐng)修改構(gòu)造函數(shù),使其在被要求創(chuàng)建第二個(gè)實(shí)例時(shí)拋出異常。單例模式與單一職責(zé)原則有沖突。源碼地址參考文獻(xiàn)設(shè)計(jì)模式之禪 定義 單例模式是一個(gè)比較簡(jiǎn)單的模式,其定義如下: 保證一個(gè)類(lèi)僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)。 或者 Ensure a class has only one instance, and provide a global point of ac...
閱讀 3743·2020-12-03 17:42
閱讀 2892·2019-08-30 15:54
閱讀 2330·2019-08-30 15:44
閱讀 667·2019-08-30 14:08
閱讀 1046·2019-08-30 14:00
閱讀 1169·2019-08-30 13:46
閱讀 2867·2019-08-29 18:33
閱讀 3173·2019-08-29 14:11