在此链接中:http://blogs.msdn.com/b/scottdensmore/archive/2004/05/25/140827.aspx 它说:
单身人士经常被用来提供全球接入点 一些服务。没错,他们这样做,但代价是什么?他们提供了一个 众所周知,您可以在应用程序中访问某些服务 你不必传递对该服务的引用。那个怎么样 与全局变量不同? (记住,全局变量很糟糕, 对???)最终发生的是你的依赖 设计隐藏在代码中,通过检查不可见 您的类和方法的接口。你必须检查代码 准确理解您的类使用的其他对象。这个更少 比它清楚。
我试图了解这与在许多地方引用我们的对象之间的区别。如果我们在其他地方有一个引用,那么我们的对象不能在一些完全不同的位置被修改,比如说其他一些帖子,并且难以推理出来吗?
答案 0 :(得分:1)
单例和全局变量之间没有太多差异。最大的区别是T类的单例只允许一个全局可用的T类实例在任何地方都可用,而拥有T的全局实例并不会限制程序创建更多的T实例。
该代码片段所讨论的问题是将实际单例与使用单例的任何代码分离的问题。如果您正在编写Foo类,理想情况下,您可能希望设计一个类,其中可以在界面中获得有关如何使用Foo的所有必要信息。现在,如果Foo使用Singleton Bar,这是Foo实现的一部分。如果用户认为不需要Bar并从程序中删除类定义,他们会突然看到Foo不能编译,并且仅仅通过查看Foo的界面并不是固有的。他们必须实际查看实现并查看抓取单例实例并使用它的代码。
如果类Foo要使用全局可用的Bar实例,你会遇到与全局变量完全相同的问题,但是它有一点不同。如果Foo在其内部包含对全局变量的引用,那么它使用Bar实例的事实是接口中固有的,并且Foo的用户至少应该理解它依赖于Bar,而全局单例总是可用和不可复制,因此Foo的写入者可能会存储对单例的引用,并且该关系不是接口固有的。
现在,关于使用全局变量存在许多其他问题,例如Unit Testing Foo。如果出于某种原因Bar对其常见功能之一的单元测试失败,那么即使Foo函数本身写得很好,很可能Foo也会对使用singleton / global Bar的函数的单元测试失败。 p>
单身人士比全局变量略差,因为明确的界面不会暗示与Bar的关系,但是你链接的文章可能会认为你应该避免使用单身人士和全局变量。