單例設計模式

單例設計模式的特色: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(){}
}
相關文章
相關標籤/搜索