java - 单例客户端应该如何使用单例?

标签 java design-patterns singleton

我不是在寻找什么是单例。有数百个链接。我还没有找到单例客户端的好例子。示例考虑一个 Singleton 类(其内部结构根本不重要)

我想使用这个对象。客户将在哪里/如何使用它?它应该在构造函数中使用吗?静态初始化器 ?

Singleton tmp = Singleton.getInstance( );

我希望有任何单例客户端示例??

最佳答案

单例模式是指当您创建一个对象时,该对象被设计为在程序中存在该对象的单个实例。作为客户端,您必须获取指向实例的指针。您只有四个选择:

  1. 在静态变量中保存引用并通过“惰性求值”进行初始化,即测试是否为 null,然后在为 null 时进行初始化。之后该值就被设置了。
  2. 在静态变量中保存引用并在静态初始化时进行初始化。你确定当时单例已经准备好了吗?这是一个令人担忧的问题。
  3. 在局部变量中保存引用,并在每次调用 getInstance() 时进行初始化。
  4. 根本不使用变量并在方法链中调用。如果一次通话只需要一份引用资料,这样就可以了。

一般来说,getInstance 应该非常高效,并且没有什么理由在您自己的静态中保存引用的副本。从某种意义上说,你的静态是重复单例类的工作,单例类也必须有一个静态。单曲不应该改变,但如果改变了,你将保留一个陈旧的引用。如果您只需要一次调用,则选项 4 是可以的,但当需要多次调用时,此模式会导致效率低下。因此,出于所有这些原因,我相信您应该使用选项 3 并每次都获取实例。

有时这种单例模式是合适的。也有一些时候是不合适的,具有静态方法的类更有效。如何判断何时使用单例模式以及何时不使用单例模式?这是我上周就该主题发表的一篇博客文章:

http://agiletribe.purplehillsbooks.com/2013/10/08/dont-abuse-singleton-pattern/

关于java - 单例客户端应该如何使用单例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19481031/

相关文章:

Java - 了解 Class<?> 类型以及调用 'Type.class' 时发生的情况

java - 内存不足错误时的堆转储

java - 为什么我必须输入 str.length()-3 ?请帮忙解释一下

c# - 将功能分为验证和实现?为什么?

c# - 过于复杂的工厂方法 - 任何解决方案?

c# - 任何获取单个实例而不是使用 Singleton 的好方法(在 C# 中)

java - 为什么有多个托管 Bean?

java - 读取 Java BufferedReader 的所有内容,包括行终止字符

java - 多级和分层状态机的设计

ios - AVPlayer 不会播放不同的格式