-1

我知道一个单例类每个 jvm 只有一个实例。

但是从设计的角度来看,如何知道什么时候让一个类成为单例?我知道实用程序类可能是单例的一个很好的例子,但还有什么?

4

4 回答 4

1

你永远不应该使用单例模式。它使您的代码更难测试,并且基本上是一个花哨的全局变量。如果您希望每个 jvm 有一个类的实例,请设计您的代码,以便它只为每个 jvm 创建一个类的实例。没有必要为此引入单例模式。有关这方面的一些示例,请查看 Spring 以及它如何使用“单例”。这是一个很好的方法。

于 2013-07-05T17:58:18.213 回答
0

对于在应用程序中有多个实例没有意义的对象,您需要强制执行单例行为。例如,对于任何应用程序来说,拥有两个SecurityManager没有多大意义。

有时,拥有两个或更多实例可能会破坏应用程序,特别是系统软件。一个很好的例子是反病毒应用程序。想象一下,有两个实时监控组件实例,每个实例都将彼此标记为恶意进程。

企业服务总线 (ESB)怎么样?如果每个模块都收到Bus的新实例,则不会连接任何东西。拥有多个应用程序缓存实例怎么样?您会通过获取其他缓存实例中已经可用的内容来浪费资源,从而导致性能下降。

所以,我希望你明白这一点。在拥有两个或多个实例时可能导致不良应用程序行为的任何事物都可以成为Singleton的候选对象。

于 2013-07-05T17:49:14.843 回答
0

仅当您知道每个人都最多需要一个对象实例时,才应该使用单例。

例如,

记录器:您不太可能需要两个记录器。

访问特定类型资源的类。

一些类型的工厂(阅读更多关于工厂模式的更多细节)

请注意,上面的示例是一般准则,肯定有例外。

这是了解更多关于单例的好地方:http ://www.oodesign.com/singleton-pattern.html

我对新程序员的建议是非常非常少地使用单例模式。我从未见过有人没有充分利用单例模式,但我看到人们一直在滥用它。

于 2013-07-05T17:44:46.473 回答
-1

这可能会有所帮助。

如何以及何时使用 Singleton 类

http://codeofdoom.com/wordpress/2008/04/20/how-and-when-to-use-singleton-classes/

来自上述链接的示例

单例的用途是什么?

单例类通常用于诸如工厂类、生成器类之类的东西。一些现实世界的例子包括 Hibernate 中的 SessionFactory 类——它实际上是一个单例。或者使用 log4j,当你调用它的记录器时,它使用一个单例类来返回它。如果有人在 Flex/Actionscript 3 中使用过 Cairngorm,那么它的模型定位器就是 Singleton。

于 2013-07-05T17:47:28.537 回答