我最近接受了一次采访,他问我关于单例设计模式是如何实现的,我告诉他使用静态变量和静态方法,我们可以实现单例设计模式。
他似乎对答案有点满意,但我想知道
我们可以通过多少种不同的方式在Java中实现单例设计模式?
关于Singleton的任何输入都将受到高度赞赏,在处理Singleton时需要牢记的主要事项是什么?
谢谢。
发布于 2010-08-07 08:52:22
在Java中实现Singleton模式有几种方法:
// private constructor, public static instance
// usage: Blah.INSTANCE.someMethod();
public class Blah {
public static final Blah INSTANCE = new Blah();
private Blah() {
}
// public methods
}
// private constructor, public instance method
// usage: Woo.getInstance().someMethod();
public class Woo {
private static final Woo INSTANCE = new Woo();
private Woo() {
}
public static Woo getInstance() {
return INSTANCE;
}
// public methods
}
// Java5+ single element enumeration (preferred approach)
// usage: Zing.INSTANCE.someMethod();
public enum Zing {
INSTANCE;
// public methods
}
在上面的例子中,每个类加载器都有一个实例。
关于在集群中使用单例...我不确定“使用”is...is面试官的定义是什么,这意味着在整个集群中创建单个实例?我不确定这是不是很有意义...?
最后,在spring中定义非单例对象只需通过属性singleton="false“即可完成。
发布于 2010-08-07 09:06:50
我不同意“声名狼藉”。
单例的作用域是它在Classloader树中的节点。它包含类加载器,并且任何子类加载器都可以看到单例。
理解这个作用域的概念很重要,特别是在具有复杂的Classloader层次结构的应用服务器中。
例如,如果您在应用程序服务器的系统类路径上的jar文件中有一个库,并且该库使用Singleton,则该Singleton将(很可能)对部署到应用程序服务器的每个“应用程序”都是相同的。这可能是一件好事,也可能不是一件好事(取决于库)。
类加载器是Java和JVM中最重要的概念之一,单例在其中发挥了作用,所以我认为Java程序员“关心”是很重要的。
发布于 2010-08-07 09:43:10
我发现很难相信有这么多答案错过了单例的最佳标准实践-使用枚举-这将给你一个单例,它的范围是类加载器,这对于大多数目的来说已经足够好了。
public enum Singleton { ONE_AND_ONLY_ONE ; ... members and other junk ... }
至于更高级别的单例-也许我有点傻-但我倾向于分发JVM本身(并限制类加载器)。那么枚举就足以胜任这项工作。
https://stackoverflow.com/questions/3428615
复制相似问题