PHP设计模式初探-详解单例模式

常见的设计模式有 24 种,其实就常规开发来说,了解其中的七八种就足够了。工厂模式是最常见的,一般初学面向对象首先接触的就是工厂模式,不多废话。

单例模式( wikipedia )是指类只维持一个实例化后的对象,特别适合于创建数据库链接。使用单例模式维护数据库链接能够避免重复建立数据库链接,在单一进程中节省不必要的资源消耗。

要做到在同一个进程中维护同一个资源,可能首先想到的是一个全局变量。一旦这个全局变量在外部被修改了,那么单例模式就完全失效了。要理解单例模式,首先要搞懂静态变量的概念。

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/

你可能感兴趣的:(设计模式,PHP,单例模式)