PHP設計模式初探-詳解單例模式

常見的設計模式有 24 種,其實就常規開發來講,瞭解其中的七八種就足夠了。工廠模式是最多見的,通常初學面向對象首先接觸的就是工廠模式,很少廢話。php

單例模式( wikipedia )是指類只維持一個實例化後的對象,特別適合於建立數據庫連接。使用單例模式維護數據庫連接可以避免重複創建數據庫連接,在單一進程中節省沒必要要的資源消耗。mysql

要作到在同一個進程中維護同一個資源,可能首先想到的是一個全局變量。一旦這個全局變量在外部被修改了,那麼單例模式就徹底失效了。要理解單例模式,首先要搞懂靜態變量的概念。sql

function test() {
    $a = 0;
    static $a;
    $a += 1;
    return $a;
}

echo test(); 
echo test();

由以上程序的運行結果能夠得知,static 關鍵字使得變量成爲一個靜態變量。
對於靜態局部變量來講,在函數內以static聲明的變量雖然與自動局部變量的做用域相同(即做用域都只限於函數內),但存儲空間是以靜態分配而非默認的自動分配方式獲取的,於是存儲空間所在區域不一樣(通常來講,靜態分配時存儲空間於編譯時在程序數據段分配,一次分配全程有效;而自動分配時存儲空間則是於調用棧上分配,只在調用時分配與釋放),且兩次調用間變量值始終保持一致;(via: wikipedia數據庫

有了靜態變量,咱們就能夠實現一個完整的單例模式了。設計模式

require_once("DB.php");
class DatabaseConnection {
    public static function get()
    {
        static $db = null;
        if ( $db == null ) {
            $db = new DatabaseConnection();
        }
        return $db;
    }
 
    private $_handle = null;
 
    private function __construct() {
        $dsn = 'mysql://root:password@localhost/photos';
        $this->_handle =& DB::Connect( $dsn, array() );
    }
 
    public function handle() {
        return $this->_handle;
    }
}

print( "Handle = ".DatabaseConnection::get()->handle()."\n" );
print( "Handle = ".DatabaseConnection::get()->handle()."\n" );

 參考資料:函數

http://www.ibm.com/developerworks/cn/opensource/os-php-designptrns/ui

相關文章
相關標籤/搜索