joomla是一个很优秀的CMS系统,个人觉得是很优秀的一个系统。在这个系统引入了很多的设计模式。其中最常见的就是单件模式了。
在joomla中一个最明显的地方就是使用数据库。只要你需要数据库,那么你就可以使用下面的代码来获得数据库:
$db = JFactory::getDBO();
非常的方便,只要你需要就可以使用。不用担心说创建了很多个对象,内存没有释放。如果查看一下joomla的源码 :libraries\joomla\factory.php中会看到下面的部分:
/** * Get a database object. * * Returns the global {@link JDatabase} object, only creating it if it doesn't already exist. * * @return JDatabase object * * @see JDatabase * @since 11.1 */ public static function getDbo() { if (!self::$database) { //get the debug configuration setting $conf = self::getConfig(); $debug = $conf->get('debug'); self::$database = self::createDbo(); self::$database->setDebug($debug); } return self::$database; }
上面是getDbo()的实现,很明显,他是一个静态的方法,这个方法首先判断$database是否有值,如果有就直接返回,如果没有就创建。它能够保证整个程序中只有一个$database实例。我们看一下self::createDbo()的实现
/** * Create an database object * * @return JDatabase object * * @see JDatabase * @since 11.1 */ protected static function createDbo() { jimport('joomla.database.table'); $conf = self::getConfig(); $host = $conf->get('host'); $user = $conf->get('user'); $password = $conf->get('password'); $database = $conf->get('db'); $prefix = $conf->get('dbprefix'); $driver = $conf->get('dbtype'); $debug = $conf->get('debug'); $options = array('driver' => $driver, 'host' => $host, 'user' => $user, 'password' => $password, 'database' => $database, 'prefix' => $prefix); $db = JDatabase::getInstance($options); if ($db instanceof Exception) { if (!headers_sent()) { header('HTTP/1.1 500 Internal Server Error'); } jexit('Database Error: ' . (string) $db); } if ($db->getErrorNum() > 0) { die(sprintf('Database connection error (%d): %s', $db->getErrorNum(), $db->getErrorMsg())); } $db->setDebug($debug); return $db; }
本来以为这是单件模式,但仔细想想,这个并不符合单件模式。
单件模式要完成的任务就是保证整个程序中只出现一个实例。可以做到延迟实例化。
实 现单件模式的一个简单的方法是:提供一个受保护的构造函数,这样外界就不能够通过构造函数来实例化对象了。然后提供一个静态的成员变量,这个静态的成员变 量用来保存类的实例。提供一个静态的getInstance方法,在这个方法中通过判断成员变量是否有值,来决定是否实例化。如果有值,就直接返回,否则 调用对象,进行实例化。
下面是一段简单的代码: