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

相关文章
相关标签/搜索