常見的設計模式有 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