设计模式之单例设计模式
1、作用:让应用程序保证最多只能有一个实例
2、好处:
- 提升运行效率
- 实现数据共享,案例:application 对象
3、四种单例模式实现方式:
- 饿汉式(线程安全,调用效率高。 但是,不能延时加载)
- 懒汉式(线程安全,调用效率不高。 但是,可以延时加载)
- 静态内部类式(线程安全,调用效率高。 但是,可以延时加载)
- 枚举式(线程安全,调用效率高,不能延时加载。并且可以防止反射和反序列化漏洞!)
4、代码示例
- 1、饿汉式:
- 线程安全,调用效率高
- 缺点:类初始化时,立即加载这个对象,不能延时加载,可能在还不需要此实例的时候就已经把实例创建出来了
复制public class SingletonDemo1 {
private static SingletonDemo1 instance = new SingletonDemo1();
private SingletonDemo1(){}
public static SingletonDemo1 getInstance(){
return instance;
}
}
- 2、懒汉式:
- 线程安全,调用效率不高
- 类初始化时,不初始化这个对象,延时加载,真正用的时候再创建。
public class SingletonDemo2 {
private static SingletonDemo2 instance;
private SingletonDemo2(){}
public static synchronized SingletonDemo2 getInstance(){
if(instance==null){
instance = new SingletonDemo2();
}
return instance;
}
}
- 在并发获取实例的时候,可能会存在构建了多个实例的情况,可加双重锁
public class SingleTon {
private static SingleTon singleton;
private SingleTon(){}
public static SingleTon getInstance(){
if(singleton == null){
synchronized (SingleTon.class) {
if(singleton == null){
singleton = new SingleTon();
}
}
}
return singleton;
}}
- 3、静态内部类式:
- 线程安全,调用效率高。可以延时加载
- 可能存在反射和反序列化漏洞
public class SingletonDemo3 {
private static class SingletonClassInstance {
private static final SingletonDemo3 instance = new SingletonDemo3();
}
private SingletonDemo3(){}
public static SingletonDemo3 getInstance(){
return SingletonClassInstance.instance;
}
}
- 4、枚举式:
- 最佳的单例实现模式,写法简单
- 线程安全,调用效率高,不能延时加载。并且可以防止反射和反序列化漏洞!
public enum SingletonDemo4 {
//这个枚举元素,本身就是单例对象!
INSTANCE;
public void singletonOperation(){
//此处可添加自己需要的操作!
}
}
调用方法:
public class Main {
public static void main(String[] args) {
SingletonDemo4.INSTANCE.singletonOperation();
}
}
5、总结:如何选用?
- 单例对象 占用资源少,不需要延时加载:
- 枚举式 好于 饿汉式
- 单例对象 占用资源大,需要延时加载:
- 静态内部类式 好于 懒汉式
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!