常见的设计模式有 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