谁能提供一个单例模式的示例并解释为什么有必要吗?
在走单身路线之前,请重新考虑。您真的需要单身人士吗?如果您需要实现单例的方案,那是因为对它们的需求并没有真正表达出来。您最好不要仅在代码库中引入单例,因为遵循设计模式会很酷。
干净的代码讨论-全局状态和单例
一次还不够
表演者单身人士
但是,真正值得了解的是Dependency Injection。
现在,如果您真的想用Java实现单例,那么我将推荐Joshua Bloch的“有效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();
getInstance();
最后要注意的是,在Java直至Java 5中,Double Checked锁定模式均已中断。Java 5内存模型使DCL模式线程安全,但是SingletonHolder在最初的意图是性能优化的同时,它使其速度比类方法慢。
SingletonHolder
编辑:正如@Luno指出的那样,自从本书第二版以来,首选方法是:
从1.5版开始,存在第三种实现单例的方法。只需使用一个元素创建一个枚举类型:
// Enum singleton - the preferred approach public enum Elvis { INSTANCE; public void leaveTheBuilding() { ... } }
此方法在功能上与公共领域方法等效,除了它更简洁,免费提供序列化机制,甚至针对复杂的序列化或反射攻击,还提供了针对多重实例化的明确保证。尽管此方法尚未得到广泛采用, 但是单元素枚举类型是实现单例的最佳方法。