设计模式-单例模式
参考:https://baijiahao.baidu.com/s?id=1762115701700295752&wfr=spider&for=pc
https://www.jb51.net/article/120969.htm
https://blog.csdn.net/weixin_44471490/article/details/108929289
使用场景#
-
数据库连接池:单例模式可以确保在某个时刻只有一个数据库连接池实例存在,避免出现重复连接的问题。
-
日志处理器:在大多数情况下,我们创建一个日志处理器实例就足够了,使其成为单例可以减少内存和资源的浪费。
-
性能管理器:单例模式可以确保性能管理器在应用程序的整个生命周期中只有一个实例运行。
-
系统配置器:在应用程序中,我们通常使用系统配置器来处理环境变量、应用程序设置等,所以将其设为单例模式可以保证系统中仅有一个实例。
-
线程池:Java 线程池是一个非常重要的 API,创建多个线程池实例可能导致内存使用过高,以将其设置为单例模式更加合适。
需要注意的是,过度使用单例模式会导致代码复杂性的增加,因此单例模式应该在确保只有一个实例有益且必要的情况下才应该使用。
饿汉式#
- 顾名思义,饿汉模式就是加载类的时候直接new一个对象,后面直接用即可。
- 饿汉模式指在类中直接定义全局的静态对象的实例并初始化,然后提供一个方法获取该实例对象。
public class Singleton {
// 使用static修饰,类加载的时候new一个对象
private static Singleton INSTANCE = new Singleton();
// 构造器私有化
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
懒汉式#
- 顾名思义,懒汉模式就是加载类的时候只声明变量,不new对象,后面用到的时候再new对象,然后把对象赋给该变量。
- 定义一个私有的静态对象INSTANCE,之所以定义INSTANCE为静态,是因为静态属性或方法是属于类的,能够很好地保障单例对象的唯一性;
- 然后定义一个静态方法获取该对象,如果对象为null,则 new 一个对象并将其赋值给INSTANCE。
public class Singleton {
private static Singleton INSTANCE;
// 构造器私有化
private Singleton() {}
public static Singleton getInstance() {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
区别#
- 饿汉模式是在类加载时将其实例化的,在饿汉模式下,在Class Loader完成后该类的实例便已经存在于JVM中了,即,在getInstance方法第一次被调用前该实例已经存在了,new对象的操作不在getInstance方法内。
- 而懒汉模式在类中只是定义了变量但是并未实例化,实例化的过程是在获取单例对象的方法中实现的,即,在getInstance方法第一次被调用后该实例才会被创建,new对象的操作在getInstance方法内。
- 此外注意:饿汉模式的实例在类加载的时候已经存在于JVM中了,因此是线程安全的;懒汉模式通过第一次调用getInstance才实例化,该方法不是线程安全的
静态内部类#
-
静态内部类通过在类中定义一个静态内部类,将对象实例的定义和初始化放在内部类中完成,我们在获取对象时要通过静态内部类调用其单例对象。
-
之所以这样设计,是因为类的静态内部类在JVM中是唯一的,这很好地保障了单例对象的唯一性。静态内部类的单例实现方式同样是线程安全的。
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton(){}
public static final Singleton getInstance(){
return SingletonHolder.INSTANCE;
}
}
作者:hasome
出处:https://www.cnblogs.com/hasome/p/17784391.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!