【发布时间】: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