缺点:
单例和全局变量都可能被误用。
因为单例在系统任何地方都可以被访问,所以它们可会导致很难调试的依赖关系。
如果改变一个单例,那么所有使用该单例的类可能都会受到影响。
在这里依赖本身并不是问题。
毕竟,我们在每次声明一个特定类型参数的方法时,也就创建了依赖关系。
问题是,单例对象的全局化的性质会使程序员绕过类接口定义的通信线路。
当单例被使用时,依赖便会被隐藏在方法内部,而并不会出现在方法声明中。
这使得系统中的依赖关系更加难以追踪,因此需要谨慎小心地部署单例类。
优点:
适度地使用单例模式可以改进系统的设计。在系统中传递那些不必要的对象令人厌烦,而单例可以让你从中解放出来。
在面向对象的开发环境中,单例模式是一种对于全局变量的改进。
你无法用错误类型的数据复写一个单例。
<?php
class Preferences{
private $props = array();
private static $instance;
private function __construct(){}
public static function getInstance(){
if(empty(self::$instance)){
self::$instance = new Preferences();
}
return self::$instance;
}
public function setProperty($key, $val){
$this->props[$key] = $val;
}
public function getProperty($key){
return $this->props[$key];
}
}
$pref = Preferences::getInstance();
$pref->setProperty("name","matt");
unset($pref); //移除引用
$pref2 = Preferences::getInstance();
print $pref2->getProperty("name");
//输出 matt
?>