PHP中单件模式(SingletonPattern)的实现
单件(singleton)模式作为设计模式的一个典型而且简单的构造型模式, 已经在很多项目的实际开发中被广泛使用, 单件模式要求一个类有且仅有一个实例,然后提供一个全局的访问点.也就是其所有的相关操作都是基于同一个实例的引用.
单件模式的特点:
单件模式的优点:
下面通过一个简单的例子来说一些单件模式
在我们实际的应用中, 大家都知道数据库的连接资源是非常宝贵的, 通过数据库句柄到数据库的连接是独占的,每次的连接和关闭数据库都是一笔非常大的开销, 那么我们如何在应用程序中来共享数据库句柄呢? 我们可以通过单件模式实现.
以下程序用到三个PHP文件, 程序只是为了展示单件模式,本身不具备任何价值.
MySQL.php
class MySQL { private $dbhost = 'localhost'; private $dbuser = 'root'; private $dbpass = '123'; private $db = 'test'; public $guid; //====================================== // 函数: connect() // 功能: 连接数据库 // 返回: //====================================== public function __construct() { $this->link_id = mysql_connect($this->dbhost, $this->dbuser, $this->dbpass); $this->guid = md5(uniqid()); if (!$this->link_id) { $this->halt("数据库连接失败.请检查连接参数."); return; } if (!mysql_select_db($this->db, $this->link_id)) { $this->halt("选择数据库".$this->db."失败."); return; } mysql_query("SET NAMES 'utf8'"); } }
Singleton.php
<?php class Singleton { private $_db; private static $_single = null; public static function getInstance() { if (self::$_single === null) self::$_single = new Singleton(); return self::$_single; } function __construct() { $this->_db = new MySQL(); } public function db() { return $this->_db; } } /* End of file */ /* Location: */
Test.php
<?PHP require_once ('MySQL.php'); require_once ('Singleton.php'); header('content-type:text/html; charset=utf-8'); echo '单件模式____________________________<br />'; $s1 = Singleton::getInstance()->db(); $s2 = Singleton::getInstance()->db(); echo '$s1->guid:'.$s1->guid.'<br />'; echo '$s1->guid:'.$s2->guid.'<br />'; echo ($s1 === $s2) ? 'true' : 'false'; echo '<br />'; echo '直接实例化对象________________________________<br />'; $d1 = new MySQL(); echo '$d->guid:'.$d1->guid.'<br />'; $d2 = new MySQL(); echo '$d1->guid:'.$d2->guid.'<br />'; echo ($d1 === $d2) ? 'true' : 'false'; ?>
将这三个文件放到一个目录中, 最后浏览test.php,可以看到
通过单件模式获取的2个对象guid参数任何时候都是相同的,且这两个对象是恒等的.
而直接实例出来的2个DB对象则刚好相反.
通过比较, 相信你已经很轻松的掌握了单件模式的特点.
转载请注明出处:http://www.suiyuan.org
Recent Comments