單例設計模式的特色:php
一、在用戶量大的應用中會存在大量的數據庫操做, 使用單例模式, 則能夠避免大量的new 操做消耗的資源。
二、使用單例設計模式,能夠全局控制某些配置信息,方便調試,單例設計模式只有一個入口,全部的代碼都集中在一個類中,定位問題簡單。redis
單例模式的特色:數據庫
一、一個類只能有一個類對象(只能實例化一個對象)設計模式
二、它必須本身建立這個實例函數
三、它必須自行向整個系統提供這個實例this
四、構造函數和克隆函數必須聲明爲私有的,這是爲了防止外部程序 new 類從而失去單例模式的意義設計
五、 getInstance()方法必須聲明爲公有的,必須調用此方法以返回惟一實例的一個引用調試
六、擁有一個保存類的實例的靜態成員變量code
七、PHP的單例模式是相對而言的,由於PHP的解釋運行機制使得每一個PHP頁面被解釋執行後,全部的相關資源都會被回收對象
八、擁有一個訪問這個實例的公共的靜態方法(經常使用getInstance()方法進行實例化單例類,經過instanceof操做符能夠檢測到類是否已經被實例化)
另外,須要建立__clone()方法防止對象被複制(克隆)
class Redis { /** * 實例化的對象,單例模式. * @var \iphp\db\Redis */ 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']; } /** * 獲得靜態實例化的對象. * 爲每一個數據庫創建一個鏈接 * 若是鏈接超時,將會從新創建一個鏈接 */ 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(){} }