【问题标题】:Does a singleton instance make sense in this case?在这种情况下,单例实例是否有意义?
【发布时间】: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 不需要是“单例”,但实际上你只会实例化一次。
  • 确实如此。 “单例”具体表示您不能多次实例化它。

标签: php oop singleton


【解决方案1】:

Singleton 基本上意味着您只能创建一个类的 1 个实例,我个人认为将其硬编码到一个类中没有意义,因为一般来说,一个类是创建的,因此您可以创建多个对象。

对于您的数据库示例,对于大多数仅处理 1 个数据库的网站来说应该没问题。但是,如果将来您想使用相同的 API 连接到外部数据库怎么办?哦,你不能,因为我实现了一个单例接口。

现在让我们谈谈您的 cookie 示例,每个网站都可以存储多个 cookie。为什么要创建一个单例呢?设计该类,使$cookie2 = new Cookie('name') 引用另一个cookie。是的,这一切都可以通过 1 个类来完成,一个单例,每次您需要解析一个名称以确定将其放入哪个 cookie。

很少有单例设计模式有用的情况,至少在 PHP 中是这样。大多数人使用容器来存储引用类的单个实例(基本上是单例)的变量。然而,该容器可以更改为另一个容器,可能是在使用相同 API 的同时引用不同数据库和不同 cookie 的测试环境之类的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    • 2020-06-19
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    相关资源
    最近更新 更多