北仑建设银行网站,网站设计 导航条,新都网站建设,wordpress怎样安装主题单例模式#xff08;Singleton Pattern#xff09;详解一、单例模式简介
单例模式#xff08;Singleton Pattern#xff09; 是一种 创建型设计模式#xff0c;它确保一个类只有一个实例#xff0c;并提供一个全局访问点来获取这个实例。#xff08;对象创建型模式…单例模式Singleton Pattern详解一、单例模式简介
单例模式Singleton Pattern 是一种 创建型设计模式它确保一个类只有一个实例并提供一个全局访问点来获取这个实例。对象创建型模式
简单来说就是“在整个应用程序中某个类只能有一个对象存在。”这在需要共享资源、统一管理状态或控制访问时非常有用。要点
某个类只能有一个实例
必须自行创建这个实例
必须自行向整个系统提供这个实例
单例模式只包含一个单例角色
Singleton单例私有构造函数
静态私有成员变量自身类型
静态公有的工厂方法
二、解决的问题类型
单例模式主要用于解决以下问题
多个对象造成资源浪费比如数据库连接池、线程池等如果每次使用都新建对象会造成性能浪费。需要全局唯一访问入口如配置管理器、日志记录器等希望整个系统中都通过同一个接口访问。避免重复初始化带来的错误例如缓存服务、任务调度器等不允许多个实例同时运行。三、使用场景场景示例配置中心如 ConfigManager 管理应用的配置信息日志记录器如 Logger 实现统一的日志输出数据库连接池如 DataSource 提供连接复用缓存服务如 CacheManager 统一管理缓存数据线程池管理如 ExecutorService 控制并发资源
四、实际生活案例
想象你在家里只有一台电视遥控器。无论你是爸爸、妈妈还是孩子大家都必须通过这一个遥控器来操作电视。如果你允许每个家庭成员都拥有自己的遥控器那么可能会出现混乱操作和资源浪费。
在这个例子中“遥控器”就是一个“单例”全家人共享一个实例。五、代码案例Java
1. 懒汉式线程不安全
class SingletonLazy {private static SingletonLazy instance;private SingletonLazy() {}public static SingletonLazy getInstance() {if (instance null) {instance new SingletonLazy();}return instance;}
}⚠️ 注意这种方式在多线程环境下可能创建多个实例。2. 懒汉式 同步方法线程安全
class SingletonLazySync {private static SingletonLazySync instance;private SingletonLazySync() {}public static synchronized SingletonLazySync getInstance() {if (instance null) {instance new SingletonLazySync();}return instance;}
}✅ 优点线程安全
❌ 缺点效率低每次调用 getInstance() 都会加锁多个线程同时访问将导致创建多个单例对象怎么办
3. 双重检查锁定Double-Checked Locking
class SingletonDCL {private static volatile SingletonDCL instance;private SingletonDCL() {}public static SingletonDCL getInstance() {if (instance null) {synchronized (SingletonDCL.class) {if (instance null) {instance new SingletonDCL();}}}return instance;}
}✅ 优点线程安全、性能较好
✅ 推荐方式之一4. 饿汉式静态常量
class SingletonEager {private static final SingletonEager INSTANCE new SingletonEager();private SingletonEager() {}public static SingletonEager getInstance() {return INSTANCE;}
}✅ 优点实现简单、线程安全
❌ 缺点类加载时就初始化可能造成资源浪费5. 静态内部类推荐写法
class SingletonInnerClass {private SingletonInnerClass() {}private static class SingletonHolder {private static final SingletonInnerClass INSTANCE new SingletonInnerClass();}public static SingletonInnerClass getInstance() {return SingletonHolder.INSTANCE;}
}✅ 优点懒加载、线程安全、简洁高效
✅ 最推荐写法之一饿汉式单例类与懒汉式单例类比较
饿汉式单例类无须考虑多个线程同时访问的问题调用速度和反应时间优于懒汉式单例资源利用效率不及懒汉式单例系统加载时间可能会比较长
懒汉式单例类实现了延迟加载必须处理好多个线程同时访问的问题需通过双重检查锁定等机制进行控制将导致系统性能受到一定影响
6. 枚举最佳实践
enum SingletonEnum {INSTANCE;public void doSomething() {System.out.println(Doing something...);}
}✅ 优点
天然线程安全天然防止反射攻击天然支持序列化/反序列化不破坏单例
✅ Joshua Bloch 推荐写法《Effective Java》作者其他案例某软件公司承接了一个服务器负载均衡(Load Balance)软件的开发工作该软件运行在一台负载均衡服务器上可以将并发访问和数据流量分发到服务器集群中的多台设备上进行并发处理提高了系统的整体处理能力缩短了响应时间。由于集群中的服务器需要动态删减且客户端请求需要统一分发因此需要确保负载均衡器的唯一性只能有一个负载均衡器来负责服务器的管理和请求的分发否则将会带来服务器状态的不一致以及请求分配冲突等问题。如何确保负载均衡器的唯一性是该软件成功的关键试使用单例模式设计服务器负载均衡器。身份证号码在现实生活中居民身份证号码具有唯一性同一个人不允许有多个身份证号码第一次申请身份证时将给居民分配一个身份证号码如果之后因为遗失等原因补办时还是使用原来的身份证号码不会产生新的号码。现使用单例模式模拟该场景。打印池在操作系统中打印池(Print Spooler)是一个用于管理打印任务的应用程序通过打印池用户可以删除、中止或者改变打印任务的优先级在一个系统中只允许运行一个打印池对象如果重复创建打印池则抛出异常。现使用单例模式来模拟实现打印池的设计。六、优缺点分析优点描述✅ 节省资源只创建一次实例避免重复创建销毁带来的性能开销✅ 全局访问提供统一的访问入口便于集中管理✅ 控制状态一致性避免多个实例导致的数据不一致问题其他允许可变数目的实例多例类
缺点描述❌ 违反单一职责原则单例类通常承担了太多责任不符合高内聚低耦合原则❌ 不利于测试依赖全局状态难以进行单元测试❌ 隐藏依赖关系使用单例时不容易看出类之间的依赖关系❌ 扩展困难如果将来需要支持多个实例重构成本较高其他由于自动垃圾回收机制可能会导致共享的单例对象的状态丢失
七、最终小结
单例模式是 Java 开发中最常用的设计模式之一它的核心思想是“保证一个类只有一个实例并提供全局访问入口。”作为一名 Java 开发工程师掌握单例模式是非常有必要的尤其是在开发工具类、配置管理器、缓存服务等组件时。
✅ 推荐使用方式总结写法是否推荐适用场景枚举✅✅✅最佳选择防反射、线程安全静态内部类✅✅常规项目首选DCL✅手动控制懒加载饿汉式⚠️类加载即初始化适合简单场景懒汉式❌多线程下不安全慎用一句话总结单例模式就像你家里的“总开关”不管谁去按都是控制同一个灯确保系统的“唯一性”和“一致性”。如果你正在构建一个需要全局统一管理的组件不妨考虑使用单例模式。
部分内容由AI大模型生成注意识别