好吧,伙计们,我很难理解为什么需要单例。
让我们举一个真实的例子:我有一个 CMS 框架
我需要一个记录一些信息的类(让我们继续使用 PHP)。
Example:
class Logger{
private $logs = array();
public function add($log) {
$this->logs[]=$log;
}
}
现在当然这个helper对于我的 CMS 页面请求的条目生命周期,对象必须是唯一的。
为了解决这个问题,我们将使其成为单例(将构造函数声明为私有等)
但到底为什么这样的类不是完全静态的呢?这将解决单例模式的需求(这被认为是不好的做法)示例:
class Logger {
private static $logs = array();
public static function add($log) {
self::$logs[]=$log;
}
}
通过使这个助手完全静态,当我们需要在应用程序中的某个位置添加日志时,我们只需要静态调用它,如下所示:Logger::add('log 1');
与单例调用相比,例如:Logger::getInstance()->add('log 1');
希望有人能让我更容易理解为什么使用单例而不是静态类 in PHP.
Edit
这是一个漂亮的 http://moisadoru.wordpress.com/2010/03/02/static-call-versus-singleton-call-in-php/对于感兴趣的人来说,关于单例与静态类的精彩讲座,感谢@James。 (请注意,它没有解决我的问题)
很多原因。
静态方法基本上是可以从任何范围调用的全局函数,这使得很难跟踪错误。您可能根本不使用类。
由于您不能拥有 __construct 方法,因此您可能必须在某处放置一个 init 静态方法。现在,人们在代码中不确定之前是否调用过 init 方法。他们会再打电话吗?他们是否必须在代码库中搜索此调用?如果 init 位于某处,但随后被删除或中断怎么办?现在代码中的许多地方都依赖于调用 init 方法的地方。
众所周知,静态方法很难用许多单元测试框架进行单元测试。
原因还有很多,但很难一一列举。
如果您使用 DI,那么单例也不是真正需要的。
附注。 DI 允许您的类不相互依赖,而是依赖接口。由于它们的关系并不牢固,因此以后更改您的应用程序会更容易,并且一个类破坏不会破坏两个类。
在某些情况下,单个状态类是可行的,例如,如果您的方法都不依赖于其他方法(基本上没有方法会更改类的状态)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)