一、引言
二、适用场景
单例模式适用于以下情况:
三、代码实战
饿汉式单例模式
public class EagerSingleton {
private static final EagerSingleton instance = new EagerSingleton();
private EagerSingleton() {
// 私有构造函数
}
public static EagerSingleton getInstance() {
return instance;
}
}
懒汉式单例模式
public class LazySingleton {
private static LazySingleton instance;
private LazySingleton() {
// 私有构造函数
}
public static synchronized LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
原理:该实现使用惰性初始化,只有在第一次调用 getInstance() 时才创建实例。通过加锁来确保线程安全,但可能引发性能问题。
双重检查锁定单例模式
public class DoubleCheckedSingleton {
private volatile static DoubleCheckedSingleton instance;
private DoubleCheckedSingleton() {
// 私有构造函数
}
public static DoubleCheckedSingleton getInstance() {
if (instance == null) {
synchronized (DoubleCheckedSingleton.class) {
if (instance == null) {
instance = new DoubleCheckedSingleton();
}
}
}
return instance;
}
}
静态内部类单例模式
public class InnerStaticSingleton {
private InnerStaticSingleton() {
// 私有构造函数
}
private static class SingletonHolder {
private static final InnerStaticSingleton instance = new InnerStaticSingleton();
}
public static InnerStaticSingleton getInstance() {
return SingletonHolder.instance;
}
}
四、实际应用举例
Java开发工具包(JDK)中有一些类和模块使用了单例模式来管理资源或确保全局唯一性。以下是一些示例:
- Runtime类:java.lang.Runtime类是Java的运行时系统入口,它使用了饿汉式单例模式来确保在应用程序中只有一个运行时实例。你可以通过Runtime.getRuntime()方法获取运行时对象的唯一实例,从而执行与运行时环境相关的操作。
- Calendar类:java.util.Calendar类是用于日期和时间操作的抽象类,它提供了一个getInstance()方法,返回特定日历系统的单例实例。这是一个懒汉式单例模式的示例,以确保只有一个日历实例。
- Desktop类:java.awt.Desktop类用于与桌面操作系统进行交互,如打开文件、浏览网页等。它使用了饿汉式单例模式来保证只有一个桌面对象的实例。
这些示例中的单例模式确保了全局唯一性,并用于管理特定资源或提供全局访问点。虽然不是所有JDK中的类都使用单例模式,但一些核心类确实使用了这种设计模式来确保一些特定的实例只存在一个。
Runtime解析
在 Java 的 Runtime 类中,使用了饿汉式单例模式来确保在应用程序中只有一个运行时实例。以下是 Runtime 类的部分代码,展示了如何使用单例模式来创建和返回运行时实例:
public class Runtime { private static Runtime currentRuntime = new Runtime(); // 私有构造函数,防止外部实例化 private Runtime() { } // 获取当前运行时实例 public static Runtime getRuntime() { return currentRuntime; } // ...其他方法和功能... }
解释:
- currentRuntime 是一个静态私有成员变量,它在类加载时被初始化。这就是饿汉式单例模式的特点,实例在类加载时就被创建,而不是在首次访问时才创建。
- 构造函数 private Runtime() 被声明为私有,这意味着外部代码无法直接实例化 Runtime 类。
- getRuntime() 方法是一个静态方法,用于获取当前运行时实例。它返回的是 currentRuntime 静态实例变量,确保每次调用 getRuntime() 方法都返回同一个实例。
这种设计确保了在整个应用程序中只有一个运行时实例,因为 currentRuntime 在类加载时就被创建,并且构造函数是私有的,外部代码无法创建新的实例。这是一种有效的方式,以确保只有一个全局运行时环境,以便执行与运行时环境相关的操作,如执行外部进程、获取系统信息等。
五、结论
以下是单例模式的一些总结和结论:
优点:
- 全局唯一性:单例模式确保一个类只有一个实例,因此能够全局唯一地管理特定类型的资源或状态。
- 惰性初始化:单例实例通常是在首次访问时初始化的,从而避免了不必要的资源浪费。
- 全局访问点:单例提供了一个全局访问点,允许应用程序中的其他对象轻松访问单例实例。
- 线程安全性:合理实现的单例模式可以确保多线程环境下的线程安全性,防止多次实例化。
缺点和注意事项:
- 过度使用:过度使用单例模式可能导致全局状态的滥用,使代码难以维护和测试。应谨慎使用。
- 不适用于所有情况:并非所有类都适合作为单例,有些类需要多个实例来独立处理不同任务。
- 测试困难:单例模式的全局状态共享可能会使单元测试变得复杂,因此需要额外的努力来测试应用。
- 多例模式:在某些情况下,可能需要多个实例,而不仅仅是一个全局唯一实例。
总的来说,单例模式是一种非常有用的设计模式,用于确保一个类只有一个实例。它在管理全局资源、限制实例数量以及提供全局访问点等方面发挥了重要作用。然而,在使用单例模式时,应慎重考虑,确保它真正符合应用程序的需求。此外,要注意线程安全性和测试问题,以确保单例实现的正确性。
点赞收藏,富婆包养✋✋
原文地址:https://blog.csdn.net/u010786653/article/details/134550332
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_7221.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!