【发布时间】:2017-03-06 20:44:37
【问题描述】:
我知道这是程序员之间争论不休的话题,而且我已经阅读了很多关于单例模式的优缺点。
我还是想问一下单例模式。
我正在创建一个小型 PHP 框架,但在我的框架中处理 Cookie 的方式被卡住了。
前期:
框架为每个模块提供了工厂函数,因此从外部看不清楚该实例是否为单例。
例子:
$db = Framework::DB(); // always a new instance
$cookie = Framework::Cookie(); // singleton (maybe?)
我的看法:
提供一个可用于改变 cookie(设置、删除、获取)的单例 cookie 实例:
class Cookie {
public function set($name, $value) {
}
}
我的理由是 cookie 是一种全局状态,您无法创建新的 cookie 环境 - 它始终由浏览器提供。 对我来说,实例化一个新的 cookie 类实例是没有意义的。
但也许我错过了什么。
基本上我想知道是否有更好的解决方案(不使用单例模式),或者这是否是单例真正有意义的情况之一。
【问题讨论】:
-
反对单例的原因是你不应该从一开始就到处实例化东西。问题“单件工厂”的正确答案?是:依赖注入。那么这只是你是否创建多个实例然后在各处注入的问题。
-
是的,我打算使用依赖注入。我的问题是顶级对象是否应该是单例。
-
例如一个使用cookies的类
class User { public function __construct(Framework\Cookie $cookie) {} }然后new User(Framework::Cookie()); -
然后,如果您使用依赖注入容器或类似的东西,您通常只实例化每个依赖项一次,然后将其注入到需要的任何地方。
Cookie不需要是“单例”,但实际上你只会实例化一次。 -
确实如此。 “单例”具体表示您不能多次实例化它。