Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在OOP中何时使用单例?_Oop_Design Patterns_Singleton - Fatal编程技术网

在OOP中何时使用单例?

在OOP中何时使用单例?,oop,design-patterns,singleton,Oop,Design Patterns,Singleton,在阅读有关singleton的文章时,我发现以下解释是使用singleton的原因: 由于这些对象方法不改变内部类状态,因此 可以将此类创建为单例 这到底意味着什么?当您认为某些方法没有改变内部类状态时?如果它是一个获得者?是否有人可以为使用不改变其内部状态的方法的类提供代码示例,从而可以作为单例使用,以及不应该作为单例使用的类 通常,当人们解释单例模式时,他们使用DB连接类作为示例。这对我来说很有意义,因为我知道在一个应用程序实例中我只希望有一个db连接。但是,如果我想在实例化DB conne

在阅读有关singleton的文章时,我发现以下解释是使用singleton的原因:

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

这到底意味着什么?当您认为某些方法没有改变内部类状态时?如果它是一个获得者?是否有人可以为使用不改变其内部状态的方法的类提供代码示例,从而可以作为单例使用,以及不应该作为单例使用的类

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

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

这是最新的。您可以按ctrl+f组合键搜索“内部”。基本上,autor解释了为什么FileStorage类是一个很好的单例候选类。我不明白这句话

“这些操作不会更改内部类状态,因此我们可以 创建一次实例并多次使用它。”

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

在他们的示例中,他们有一些文件存储类:

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

    public function read() {
        // whatever
    }

    public function write($content) {
        // whatever
    }
}
他们说这个类可以是一个单例类,因为它的read()和write()方法不会改变内部类结构。这是什么意思?它们不是setter,类自动成为singleton?

引用如下:

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

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


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

如果你想解释为什么有人喜欢单身,你应该提供更多的参考,而不是断章取义的句子片段。我不知道作者的意思,你也没有提供足够的上下文来做出一个好的猜测。也许你可以问作者他们的意思。另外,你这里有七个问题,这表明这个问题一点也不清楚。您能问一个更具体、更关注代码的问题吗?像这样的问题更有可能得到好的、明确的答案。@EricLippert这些不是真正的7个问题,它们都是为了澄清我所问的主要问题。我现在将添加引用。重点是,您正在“注入”的“依赖性”是一个没有状态的东西。它所做的只是改变周围的世界。所以它们之间没有区别,所以你只需要其中一个。这里,我有两个文件系统对象,它们都可以读写硬盘。他们之间有什么区别?没有。那你为什么需要两个呢?你没有。因此,如果您在时间X需要一个,在时间Y需要另一个,您可以毫无问题地重新使用您在时间X拥有的一个。另外,请记住,依赖注入、控制反转等等,都是五美元一个五美分的概念:一个需要提供服务的类可以自己创建一个服务提供者,或者由调用方提供给服务提供商。我们称后者为“依赖注入”。围绕它的所有行话都会混淆和混淆什么是一个非常简单的概念。但是,你认为这个对象什么时候有内部状态?当它修改其属性时?内部状态=实例变量、属性,或在您选择的语言中调用的任何东西。不过,当你不必在意这一点时,这是最好的,因为这是一个假设,以后可能会在你没有注意到的情况下被打破。这就是为什么我说,当你遇到明显的性能问题时,你应该只关心这些事情。现在我看到了一种常见的模式,即对象(通常是服务)没有状态,不管它们的创建是不是可测量的瓶颈,它们都是单例的。事实上,通过使类成为单例类,它们强制开发人员在其中不保留任何状态:)