Java设计模式(单例模式)

定义

       确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例。

角色

       单例类:在单例类内部创建它的唯一实例,并通过静态方法来让客户端可以使用它的唯一实例。 客户端类:通过使用单例类提供的方法,来获取该类的唯一实例,而不是通过实例化的方式获得。

优点

       提供了对唯一实例的受控访问

       可以节约系统资源,提高系统的性能

缺点

       扩展困难(缺少抽象层)

       单例类的职责过重

       由于自动垃圾回收机制,可能会导致共享的单例对象的状态丢失

适用场景

       系统只需要一个实例对象,或者因为资源消耗太大而只允许创建一个对象

       客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不能通过其他途径访问该实例

案例

       某软件公司承接了一个服务器负载均衡(Load Balance)软件的开发工作,该软件运行在一台负载均衡服务器上,可以将并发访问和数据流量分发到服务器集群中的多台设备上进行并发处理,提高了系统的整体处理能力,缩短了响应时间。由于集群中的服务器需要动态删减,且客户端请求需要统一分发,因此需要确保负载均衡器的唯一性,只能有一个负载均衡器来负责服务器的管理和请求的分发,否则将会带来服务器状态的不一致以及请求分配冲突等问题。如何确保负载均衡器的唯一性是该软件成功的关键,试使用单例模式设计服务器负载均衡器。

类图

### Java 中的单例模式设计与实现 #### 单例模式的概念 单例模式是一种创建型设计模式,它确保某个类只有一个实例存在,并提供全局访问点来获取该实例。这种模式特别适用于那些只需要单一控制中心的应用场景。 #### 实现方式 ##### 饿汉式(Eager Initialization) 饿汉式的优点在于简单易懂,在类加载时就完成了初始化工作,因此不存在线程安全问题。 ```java public class EagerInitializedSingleton { private static final EagerInitializedSingleton instance = new EagerInitializedSingleton(); private EagerInitializedSingleton() {} public static EagerInitializedSingleton getInstance() { return instance; } } ``` ##### 懒汉式(Lazy Initialization) 懒汉式是在第一次调用 `getInstance()` 方法时才去创建对象,可以节省资源开销,但是需要考虑多线程环境下的安全性[^2]。 ```java public class LazyInitializedSingleton { private static LazyInitializedSingleton instance; private LazyInitializedSingleton() {} synchronized public static LazyInitializedSingleton getInstance() { if (instance == null) { instance = new LazyInitializedSingleton(); } return instance; } } ``` 为了提高性能并保持线程安全,通常会采用双重校验锁的方式优化懒汉式实现: ```java public class DoubleCheckedLockingSingleton { private volatile static DoubleCheckedLockingSingleton uniqueInstance; private DoubleCheckedLockingSingleton() {} public static DoubleCheckedLockingSingleton getInstance() { if (uniqueInstance == null) { // First check before locking synchronized (DoubleCheckedLockingSingleton.class) { if (uniqueInstance == null) { // Second check after acquiring lock uniqueInstance = new DoubleCheckedLockingSingleton(); } } } return uniqueInstance; } } ``` ##### 枚举类型 枚举类型的实现不仅简洁而且天然具备序列化机制以及防止反序列化的特性,是最推荐的一种实现方法。 ```java public enum EnumSingleton { INSTANCE; public void someMethod(){ } } ``` ##### 内部静态辅助类法(Bill Pugh Singleton Implementation) 这种方法利用了JVM对于内部类加载的特点,既实现了延迟加载又解决了线程同步的问题。 ```java public class BillPughSingleton { private BillPughSingleton(){} private static class SingletonHelper{ private static final BillPughSingleton INSTANCE = new BillPughSingleton(); } public static BillPughSingleton getInstance() { return SingletonHolder.INSTANCE; } } ``` #### 使用案例 `java.lang.Runtime` 是 JDK 自带的一个典型应用例子,通过其唯一的运行时表示当前 JVM 的运行状态,并提供了许多有用的工具函数给开发者使用。可以通过 `getRuntime().availableProcessors()` 获取处理器数量等操作[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值