单例模式
来了来了,他来了。大家好,我是老王。今天给大家带来的是23种设计模式的第一种——单例模式。前天写的第一篇文章设计模式的七大原则,是我第一次写文章,目前看了浏览量,让我信心大增。文章有什么讲述方式不对的欢迎大家随时给我私信。24小时恭候!!(创作不易,还望各位仁兄看完举起小手点个小赞。)
一、引言
单例模式是啥????故名思意,就是单着的意思 = =!没错,就是为了来保证整个系统运行中,从头至尾只有一个对象。比如说,我们最可爱的学校,可以有很多学生,可以有很多主任,但是不能有很多校长。为什么?因为要确保只有一个校长,学校这个系统才不会因为受干扰崩溃,所以单例模式应运而生。
二、实现方式
【Java设计模式——单例模式】
单例模式是一种常见的软件设计模式,它的核心思想是确保在应用程序的整个生命周期中,某个类只有一个实例存在。这种模式主要用于控制类的实例化过程,减少系统资源的消耗,提高系统效率。比如,学校的校长角色,系统中只需要一个校长实例,以保持系统的一致性和稳定性。
实现单例模式主要有以下五种方法:
1. **饿汉式**:
- 饿汉式是在类加载时就创建了单例对象,确保了线程安全。这种方式简单直接,但可能会导致不必要的资源浪费,即使在系统中并未使用到单例对象。
```java
class Laowang {
private static final Laowang laowang = new Laowang();
private Laowang() {}
public static Laowang getLaowang() {
return laowang;
}
}
```
2. **懒汉式**:
- 懒汉式是在首次需要时才创建单例对象,实现了延迟加载。但是,如果不使用同步控制(如`synchronized`关键字),则可能存在线程安全问题。同步的懒汉式虽然解决了线程安全,但会降低性能。
```java
class Laowang {
private static Laowang laowang;
private Laowang() {}
public static synchronized Laowang getLaowang() {
if (laowang == null) {
laowang = new Laowang();
}
return laowang;
}
}
```
3. **双重检查锁定(DCL,Double-Check Locking)**:
- DCL是在懒汉式的基础上改进的,既延迟加载又保证了线程安全,通过两次检查`laowang`是否为`null`避免了不必要的同步。
```java
class Laowang {
private volatile static Laowang laowang;
private Laowang() {}
public static Laowang getLaowang() {
if (laowang == null) {
synchronized (Laowang.class) {
if (laowang == null) {
laowang = new Laowang();
}
}
}
return laowang;
}
}
```
4. **内部类方式**:
- 使用内部类可以保证单例在类装载时不会被初始化,只有当调用`getInstance()`方法时才会初始化单例。
```java
class Laowang {
private Laowang() {}
private static class SingletonHolder {
private static final Laowang laowang = new Laowang();
}
public static Laowang getLaowang() {
return SingletonHolder.laowang;
}
}
```
5. **枚举方式**:
- 通过枚举类型实现单例模式是线程安全且防止反射攻击的最佳选择。
```java
enum Laowang {
INSTANCE;
public void doSomething() {
// ...
}
}
```
每种实现方式都有其适用场景,开发者需要根据实际需求选择合适的方法。在实际应用中,考虑到性能和线程安全,双重检查锁定和枚举方式通常更受欢迎。同时,单例模式虽然有其优势,但在某些情况下也可能带来维护困难或违反开闭原则等问题,因此在设计时需谨慎使用。