/**
* 单例模式,顾名思义强调的是单一,只有一个实例,而且自行实例化并向整个系统提供这个实例。
*
* 创建型模式
* 条件3点
* 1、需要一个静态变量,保存类的唯一实例。
* 2、需要一个公共静态方法,返回唯一实例的一个引用。
* 3、构造函数(__construct)、克隆函数(__clone)私有化,从而防止外部程序 new 类,从而失去单例模式的意义。
*
* 优点:
* 1、节省系统资源,避免重复实例化,是一种“计划”生育。
* 2、避免大量的new 操作。例如,数据库应用。一个系统程序,会存在大量的数据库操作,如果使用单例模式,就可以避免大量new 操作。
* 3、如果系统中需要一个类来全局控制某些配置信息,那么使用单例模式可以很方便的实现。这个可以参看zend framework 的frontController部分。
* 4、便于调试,管理,因为所有代码 都集中在一个类里。我们可以在类中设置钩子,输出日志,从而避免 到处 var_dump,echo
*
* 缺点:
* 众所周知,php语言是一种解释型脚本语言,这种运行机制使得每个php页面被解释执行后,所有的相关资源都会被收回。也就是说,php在语言级别上没办法使某个对象常驻内存。
* 这与asp.net、java等编译型是不同的。然而php,所有的变量无论是全局变量还是静态变量,静态成员都是页面级的。
* 每次页面执行时,都会重新建立新的对象,都会在页面执行完毕后被清空。
* 这样似乎php单例模式没什么意义了,所以php的单例模式是针对单次页面级同时出现多个应用场景并需要共享同一对象资源时,是非常有意义的。
*
*/
class singleton {
private static $_instance = null;
public static function getInstance() {
if (self::$_instance == null) {
self::$_instance = new self();
}
return self::$_instance;
}
/**
* 构造方法声明为private,防止直接创建对象。
*
*/
private function __construct() {
}
/**
* 克隆方法声明为private,防止复制对象实例。
*
*/
private function __clone() {
}
}
$instance = singleton::getInstance();
var_dump($instance);
//$error = new singleton();
//$error = clone $instance;
扩展知识
1、单例模式 两职责。
管理自己的实例,自行实例。
提供全局访问点
2、一个类应该职责单一,是否违法oo 设计原则?
单例模式,是有两个职责。由类管理自己的实例的做法并不少见。这可以让整体设计更简单。许多开发人员都已经熟悉了单例模式的做法。