单元素模式[转]

<?php
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" );
?>

某些应用程序资源是独占的,因为有且只有一个此类型的资源。例如,通过数据库句柄到数据库的连接是独占的。您希望在应用程序享数据库句柄,因为在保持连接打开或关闭时,它是一种开销,在获取单个页面的过程中更是如此。单元素模式可以满足此要求。如果应用程序每次包含且仅包含一个对象,那么这个对象就是一个单元素(Singleton)。

本例中,注意到资源连接句柄$_handle是似有属性,而构造方法__construct()为似有方法,所以外部对象无法使用。所以只能使用静态方法get()来获取该类的对象。由于静态方法get()中有一个静态的局部变量$db=null,所以每次调用get()方法创建对象时,总是返回的同一个$db,而每次调用get()方法,都会执行$db=null,所以该对象都会随即完成初始化而不会影响继续使用。