PHP设计模式:Singleton单例模式
发布于: August 20, 2009, 11:20 am 分类: PHP/MySQL 作者: Saturn
此文承接之前我在PHP中实现简单工厂和抽象工厂的讨论,讨论一个广泛应用在OOP体系中的设计模式——Singleton模式。
Singleton Pattern(中文称单例模式),可以说是最容易理解的设计模式了,也充分体现了DRY (Don't Repeat Yourself)的思想。它的核心思想是:保证一个对象存在且仅允许存在一个实例,并提供一个全局访问方式[via]。
单例模式的运作模型是:当对象第一次被请求时,创建这个对象的实例;之后的每次请求,仅传递已创建实例的句柄。与单例模式相对应的模式叫做Prototype(Java平台下)或者叫SingleCall(.NET平台下),在此种模式下,每次请求一个对象,都将新建一个实例。
在WEB程序中应用单例模式的一个典型例子是数据库连接的创建:通过数据库句柄来连接数据库这一行为是独占的。换言之,在一个句柄尚未关闭之前,你无法第二次创建一个相同名称的句柄。然后在日常编码中,假设你希望在同一页面中操作由数据库传递回来的多组数据。此时如果采用传统的Prototype方式编程,为了程序的安全运行,你可能需要创建多个数据库链接句柄或者重复进行打开/关闭数据库连接的操作。显然,这样的操作会导致程序过度消耗一些不必要的资源。
在此场景下,我们可以运用单例模式来维护和共享同一个数据库句柄。优点有二:
1、提高了程序运行上的安全性。你不必过多的担心和考虑诸如数据库打开/关闭的问题。
2、避免了因创建多个连接导致的不必要资源浪费。垃圾回收机制仅需要对一个链接句柄进行操作。
当然,以上两个问题对于PHP来说并不是问题,PHP的垃圾回收机制就是,当一个页面执行完毕会自动清空所有资源和内存,这里面就包括数据库连接。
至此,可以总结出Singleton单例模式在WEB程序中的运用场合:
1、某些资源本身具有独占性,你不希望在多个地方重复创建对这个独占资源对象的实例。
2、你需要在一个对象的多个实例之间共享这个对象的状态(下面我会将此条规则进行代码举例)。
下面写一段小代码来演示PHP 5中Singleton的实现:
/***************************************************************************
* Singleton在PHP5中的实现
*
* @Author : Saturn
* @Contact: http://www.cnsaturn.com/
***************************************************************************/
class Singleton
{
//此成员变量用来记录此对象的引用次数
private $counter = 1;
//注意这里是private,即禁止外部程序通过解析函数实例化对象
private function __construct()
{ }
//禁止克隆这个对象
private function __clone()
{ }
//必须通过此方法得到对象的引用
public static function getInstance()
{
static $instance = null;
if($instance == null)
{
$instance = new Singleton();
}
return $instance;
}
public function getUsedCount()
{
return $this->counter++;
}
}
//test test
echo Singleton::getInstance()->getUsedCount();//echo 1
echo Singleton::getInstance()->getUsedCount();//echo 2
echo Singleton::getInstance()->getUsedCount();//echo 3
$obj = new Singleton();//trigger fatal error
?>
此程序演示的是如何通过Singleton模式让多个引用能够同时共享此对象的某个状态,在这里是共享$counter。
注意,我们将解析函数的Scope设置成了private,这样做为了禁止通过解析函数实例化对象,而必须使用对象提供的静态化方法getInstance来获取对象的引用。
这个例子比较简单,但已经初步展示了单例模式的核心思想,仅起抛砖引玉的作用。
1 个评论 »
March 4, 2010, 3:08 pm
谢谢 讲的好
回应此文
你也可以选择引用此文章.