单例模式(Singleton Pattern 单件模式或单元素模式)
单例模式有以下3个特点:
1、一个类只能有一个类对象(只能实例化一个对象)
2、它必须自己创建这个实例
3、它必须自行实例化并向整个系统提供这个实例
4、构造函数,克隆函数必须声明为私有的,必须提供一个访问这个实例的公共静态方法(通常命名为getInstance),从而返回唯一实例的一个引用
采用单例模式的原因:
php语言是一种解释型的脚本语言,这种运行机制使得每个PHP页面被解释执行后,所有的相关资源都会被回收。也就是说,PHP在语言级别上没办法使得某个对象常驻内存,这和编译型语言不同,比如在java中单例会一直存在整个应用程序的生命周期里,变量是跨页面的,真正做到这个实力在应用程序生命周期的唯一性。然而在PHP中,所有的变量无论是全局变量还是类的静态成员,都是页面级的,每次页面被执行时,都会重新建立新的对象,都会在页面执行完毕后被清空,这样的PHP单例模式就没有什么意义,所以PHP单例模式我觉得只是针对单次页面级请求时粗线多个应用场景并需要共享同一对象资源时是非常有意义的。
上面的对象图中,有一个"单例对象",而"客户甲","客户乙"和"客户丙"是单例对象的三个客户对象。可以看到,所有的客户对象共享一个单例对象。而且从单例对象到自身的连接线可以看出,单例对象持有对自己的引用。
php代码实现单例模式:
class User {
//静态变量保存全局实例
private static $_instance=null;
//私有构造函数,防止外界实例化对象
private function __construct(...){
$this->_db = pg_connect(...);//postgrsql
}
//私有克隆函数,防止外界克隆对象
private function __clone() {
};
//静态方法,单例统一访问路口
public static function getInstance(){
if(! (self::$_instance instanceof self) ) {
self::$_instance = new self();
}
return self::$_instance;
}
?>
单例模式的优缺点:
优点:
1、改进系统的设计
2、是对全局变量的一种改进
缺点:
1、难于调试
2、隐藏的依赖关系
3、无法用错误类型的数据覆写一个单例