【问题标题】:When to use singletons in OOP?何时在 OOP 中使用单例?
【发布时间】:2016-12-20 18:48:43
【问题描述】:

在阅读单例时,我发现这个解释是使用单例的原因:

由于这些对象方法不会改变内部类的状态,我们 可以将此类创建为单例。

这到底是什么意思?当您认为某些方法没有改变内部类状态时?如果是吸气剂?有人可以为使用不改变其内部状态的方法的类提供代码示例,因此可以用作单例,以及不应该是单例的类吗?

通常,人们在解释单例模式时,都会以 DB 连接类为例。这对我来说很有意义,因为我知道我希望在一个应用程序实例中只有一个数据库连接。但是,如果我想在实例化数据库连接类时提供强制使用新连接的选项怎么办?如果我有一些设置方法或构造函数参数强制我的类打开新连接,那么该类仍然是单例的主题吗?

我正在使用PHP,但可以理解用JAVA、C#编写的示例...

这是article reference。您可以 ctrl+f 搜索“内部”。基本上,autor 正在解释为什么 FileStorage 类是一个很好的单身候选人。这句话看不懂

"这些操作不会改变内部类的状态,所以我们可以 一次创建它的实例并多次使用它。”

因此我不明白何时使用单例。

在他们的例子中,他们有一些 FileStorage 类:

class FileStorage
{
    public function __contruct($root) {
        // whatever
    }

    public function read() {
        // whatever
    }

    public function write($content) {
        // whatever
    }
}

他们说这个类可以是一个单例,因为它的方法 read() 和 write() 不会改变内部类结构。这意味着什么 ?他们不是二传手,类是自动单例的?

【问题讨论】:

  • 如果你想解释为什么有人喜欢单例,你应该提供更多的参考而不是断章取义的句子片段。我不知道作者是什么意思,你也没有提供足够的上下文来做出一个好的猜测。也许问问作者他们的意思。
  • 还有,你这里有七个问题,说明这个问题一点儿也不明白。你能问一个更具体以代码为中心的问题吗?这样的问题更有可能得到好的、明确的答案。
  • @EricLippert 这些并不是真正的 7 个问题,它们都是为了澄清我作为主要问题提出的问题。我现在将添加参考。
  • 关键是你“注入”的“依赖”是一个没有状态的东西。它所做的只是改变它周围的世界。因此,它们中的任何两个都没有区别,因此您只需要其中一个。在这里,我有两个文件系统对象,它们都可以读写你的硬盘。他们之间有什么区别?空无一人。那么为什么需要两个呢?你没有。因此,如果您在 X 时间需要一个,而在 Y 时间需要另一个,您可以毫无问题地重复使用您在 X 时间拥有的那个。
  • 另外,请记住依赖注入,控制反转,等等等等,是五美分概念的五美元词:需要提供服务的类可以自己创建服务提供者,或者由其调用者提供给服务提供者。我们称后者为“依赖注入”。它周围的所有行话都会混淆和混淆真正非常简单的概念。

标签: oop design-patterns singleton


【解决方案1】:

引述如下:

这些操作不会改变内部类的状态,所以我们可以一次创建它的实例并多次使用它。

这意味着有问题的对象没有可以更改的有趣内部状态;它只是一组方法(可能是静态的)。如果对象没有内部状态,你不必创建它的多个实例,你可以继续重用一个。因此,您可以配置依赖注入容器以将对象视为单例。

这只是性能优化。您可以在每次需要时创建该类的新实例。而且会更好——直到对象创建成为可衡量的瓶颈。

【讨论】:

  • 但是你什么时候认为该对象具有内部状态?什么时候修改它的属性?
  • 内部状态 = 实例变量、属性或您选择的语言中的任何名称。不过,最好不要在意这一点,因为这是一个假设,以后可能会在你不注意的情况下被打破。这就是为什么我说你应该在遇到明显的性能问题时才关心这些事情。
  • 现在有一天我看到了常见的模式,即对象(通常是服务)没有状态,无论它们的创建是否是可测量的瓶颈,都被设为单例。事实上,通过将类设为单例,他们强制开发人员不会在其中保留任何状态:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多