在Java中实现单例模式

任何人都可以提供单例模式的例子并解释为什么它们是必要的吗?

在走单身路线之前,重新考虑一下。 你真的需要一个单身人士吗? 如果您在需要实现单例时要求场景,那是因为对它们的需求并没有真正表达出来。 你最好不要在你的代码库中引入单例,因为跟随设计模式感觉很酷。

清洁代码会谈 – 全球国家和单身人士

一旦不够

表演者单身人士

然而,真正值得了解的是dependency injection 。

现在如果你真的想用Java实现单例,我会推荐Joshua Bloch的“Effective Java”实现方法:

public class Singleton { public static Singleton getInstance() { return SingletonHolder.instance; } private Singleton() {} private static final class SingletonHolder { static final Singleton instance = new Singleton(); } } 

JLS保证JVM不会初始化实例,直到有人调用getInstance();

最后需要注意的是, Double Checked Locking Pattern在Java 5中已经破解 。 Java 5内存模型使DCL模式线程安全,但它使得它比SingletonHolder类方法慢,而原始意图是性能优化 。

编辑:正如@Luno指出的那样, 自本书的第二版以来,首选的方法是:

从版本1.5开始,有第三种方法来实现单例。 只需使用一个元素创建一个枚举类型:

 // Enum singleton - the preferred approach public enum Elvis { INSTANCE; public void leaveTheBuilding() { ... } } 

这种方法在function上等同于公共字段方法,除了它更简洁,免费提供序列化机制,并提供防止多个实例化的铁定保证,即使面对复杂的序列化或reflection攻击。 虽然这种方法尚未被广泛采用, 但单元素枚举类型是实现单例的最佳方法。

基本上,在Java中,您通过为类提供私有的无参数构造函数( private MyClass() )来实现单例,并静态(或懒惰地)初始化由静态MyClass getInstance()方法返回的类的单个实例。

当您希望在整个应用程序中只有一个类的实例时,可以使用它。

danben对单例是什么有很好的总结,所以我不会重复它。

就用途来说,单身人士往往是全局变量的薄弱实现(这是一个坏主意)。 它们可用于消息路由器或管理器类(以及其他内容)。

JavaWorld上的 ‘ Simply Singleton ‘

如果你真的想进入战壕,开始阅读关于群体或谷歌的“静态与单身”。 总是一个热门话题至少可以说!

一个经常被低估的单身人士善良的地方就是当你想要抽象出国家的存在时。 一个例子是随机数发生器。 在抽象层次上,它只生成随机数,并且没有调用者需要关心的任何状态。 但是,在实施层面,涉及到国家。 另一个是当函数缓存结果或中间计算时,但您想要从调用者隐藏此详细信息。

这里有一个重要的权衡。 如果你制作像这些单例的东西,你减少了函数调用者必须关心的实现细节量,从而减少了那个方向的耦合。 但是,与此同时,您将函数强烈地耦合到单例对象,使其更难以测试等。关于是否使用单例的决定应该基于您关心减少耦合的方向。

假设您在办公室中只有一台打印机并且您需要确保打印机类只有一个实例

 printer{ private static printer instance =null; private printer(){} public static printer getinst(){ if( instance==null){ instant = new printer(); } return instance; } } 

在主要

 printer v=printer.geti();