在实际应用中使用Singleton Pattern的确切位置是什么?

时间:2010-07-07 05:17:09

标签: java singleton

我很好奇究竟使用了单身人士模式...... 我知道模式是如何工作的以及它可以在哪里使用但我个人从未在任何实际应用中使用过。 有人可以给出一个可以使用它的例子。 如果有人能够解释他们在实际应用中的使用方式和位置,我将非常感激。 谢谢, 斯瓦特

12 个答案:

答案 0 :(得分:57)

通常,单例用于全局配置。最简单的例子是LogManager - 有一个静态LogManager.getLogManager()方法,并且使用了一个全局实例。

实际上这不是一个“真正的”单例,因为你可以从LogManager派生自己的类并以这种方式创建额外的实例 - 但它通常是使用作为单例。 / p>

另一个例子是java.lang.Runtime - 来自文档:

  

每个Java应用程序都有一个   允许的类运行时的实例   与...接口的应用程序   应用程序的环境   在跑。当前运行时可以   从getRuntime方法获得。

这几乎是单身人士的定义:)

现在单身模式主要是这些天皱起了眉头 - 它引入了紧密耦合,并使使用单例的东西更难测试,因为你不能轻易地模拟出那个组件。如果没有它就能逃脱,那就更好了。尽可能地注入您的依赖项。

答案 1 :(得分:11)

一些例子:

  • 硬件访问
  • 数据库连接
  • 配置文件

答案 2 :(得分:11)

我在在线足球队商店系统中使用了单身模式。我们将单例模式应用于ShoppingCart类。

每个应用程序实例只需要一个购物车实例。所以单身人士似乎最适合这种情况。

答案 3 :(得分:2)

Singleton是一个不错的设计模式。在决定模式之前,首先要对问题和解决方案进行深入分析。如果在您的解决方案中某个对象只有一个实例,并且您希望在设计中对其进行建模,那么您应该使用单例模式。例如,如果您在软件中对PC进行建模,则只有一个PC实例与您正在运行的程序相关。正如Jon Skeet所说,java.lang.Runtime被建模为单例,因为对于在java运行时内加载和运行的所有java对象,只有一个运行时实例。

很多时候它被用于错误的原因。永远不要创建一个单例,以便您可以从任何地方轻松访问该对象(如Object :: instance()),而无需传递对象。这是我遇到的最糟糕的用途。

答案 4 :(得分:2)

例如,运行具有一个许可证和一个数据库连接的软件的试用版,它使用单词模式。可能是大师jon双向飞碟可以提供这样的例子。

答案 5 :(得分:2)

使用Logger时,对Logger类使用Singleton模式。如果它不是Singleton,每个客户端都有自己的Logger对象,并且在Multithreaded环境中将在Logger实例上进行并发访问,并且多个客户端将同时创建/写入Log文件,这会导致数据损坏。

答案 6 :(得分:2)

考虑以Singleton Pattern设计的 AudioDriverService 的情况。因此,我们只允许创建 AudioDriverService 类的单个实例。实际上,您的Windows Media Player或Youtube播放器将共享 AudioDriverService 的相同对象,而不是创建新实例。

答案 7 :(得分:1)

Singleton Pattern可以用于加载配置,比如在Web应用程序中,我们应该生成一个文件,存储在服务器的某个地方。现在,该位置可以使用单例类从配置文件(属性文件)中获取。因为该位置是唯一的,并且将来可能会经常更改,所以我们使用配置文件,以便可以在不部署应用程序的情况下进行修改,以便通过应用程序反映变化和位置将是全球性和独特的

答案 8 :(得分:1)

单一模式通常在创建一次并共享的对象时很有用 跨不同的线程/应用程序。 考虑一下您正在为打印机实现属性加载类。

现在,打印机可以是变体属性。例如: - 单色打印机, 彩色打印机, 自动扫描仪支持打印机等...

每次启动时,必须加载此配置文件才能启用几个按钮/应用程序 在UI上标签或任何打印机UI。

支持的功能的值以配置表的形式存储,如1表示 支持功能,如果不支持则为0。

根据支持的功能,我们启用禁用某些功能和应用程序 在UI上。现在这个配置文件位置是由单个公司制造的打印机 总是存储在固定的路径上。

文件值将更改/仅在以下情况下读取: - 1.开机时。 2.添加或删除任何新的硬件外围设备。

我们可以使用单例类来实现配置文件的读取。作为相同的价值观 即,配置在UI干预时不会改变,只能在硬件干预时更改。

这是我能想到的一个例子,我们可以在哪里实现Singleton设计模式。

答案 9 :(得分:0)

我在使用pureMVC的应用程序中使用了单例(实际上是其中几个)。我们对这个框架引入的复杂性感到不满(通过mvc层跟踪方法调用变得复杂和分层)。因此,我们使用中心单例作为中介来更好地将各层彼此分开。

答案 10 :(得分:0)

我在我的Android应用程序中使用了一个媒体播放器,所以我扩展了mediaplayer类,并使用了单例模式,因为我只需要一个实例,并能够在我的应用程序的任何其他部分调用相同的实例来检查是否正在播放,或正在播放的是什么文件。

希望它可以帮助你,尊重!!!!

答案 11 :(得分:0)

当您只必须允许类的单个实例化时,基本上使用Singleleton类。 以现实世界为例,在对库进行OOP设计的情况下,我们可以将库类创建为单例类。