设计模式详解之单例模式

一、定义

单例模式是创建型的

定义:确保一个类只有一个实例,并提供该实例的全局访问点

组成:使用了一个私有构造函数、一个私有静态变量以及一个公有静态函数来实现。

私有构造函数保证玩了不能通过构造函数来创建对象实例,只能通过公有静态函数返回唯一的私有静态变量。

二、实现

1、饿汉式

应用场景:

1、初始化时就需创建单例

2、单例对象要求初始化速度快,占用内存小

原理:

依赖JVM类加载机制,保证单例只被创建一次

优点:

1、线程安全

2、初始化速度快

3、占用内存小

缺点:

1、创建时机不可控制

java 复制代码
private static Singleton uniqueInstance = new Singleton();

2、枚举类型

应用场景:

1、初始化时就需创建单例

2、单例对象要求初始化速度快,占用内存小

原理:

1、枚举类型 = 不可被继承的类

2、每个枚举元素 = 类静态常量 = 依赖JVM 类加载机制,保证单例只被创建1次

3、枚举元素都通过静态代码块来进行初始化

4、构造方法访问权限 默认 = 私有 (private)

5、大部分方法都是final

优点:

1、线程安全

2、自由序列化

3、实现更加简单、简洁

缺点:

1、创建时间不可控制

java 复制代码
public enum Singleton {
    uniqueInstance;
}

3、懒汉式

应用场景:

1、按需、延迟创建单例

2、单例初始化的操作耗时长

3、单例的占用内存比较大

原理:

1、类加载时,先不自动创建单例

2、需要时手动创建单例

优点:

1、按需加载单例

2、节约资源

缺点:

1、线程不安全

java 复制代码
public class Singleton {

    private static Singleton uniqueInstance;

    private Singleton() {
    }

    public static Singleton getUniqueInstance() {
        if (uniqueInstance == null) {
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }
}

4、同步锁

应用场景:

1、按需、延迟创建单例

2、单例初始化的操作耗时长

3、单例的占用内存比较大

原理:

1、使用同步锁 synchronized 锁住创建单例的方法

优点:

1、线程安全

缺点:

1、造成过多的同步开销

5、双重校验锁

应用场景:

1、按需、延迟创建单例

2、单例初始化的操作耗时长

3、单例的占用内存比较大

原理:

锁一:若单例已创建,则直接返回已创建的单例,无需再执行加锁操作

锁二:防止多次创建单例问题

优点:

1、线程安全

2、节约资源

缺点:

1、实现复杂

java 复制代码
public class Singleton {

    private volatile static Singleton uniqueInstance;

    private Singleton() {
    }

    public static Singleton getUniqueInstance() {
        if (uniqueInstance == null) {
            synchronized (Singleton.class) {
                if (uniqueInstance == null) {
                    uniqueInstance = new Singleton();
                }
            }
        }
        return uniqueInstance;
    }
}

6、静态内部类

应用场景:

1、按需、延迟创建单例

2、单例初始化的操作耗时长

3、单例的占用内存比较大

原理:

1、在静态内部类里创建单例,在装载该内部类时才会去创建单例

2、类是由JVM加载,而JVM只会加载1遍,保证只有一个单例

优点:

1、线程安全

2、节省资源

3、实现简单

java 复制代码
public class Singleton {

    private Singleton() {
    }

    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getUniqueInstance() {
        return SingletonHolder.INSTANCE;
    }
}
相关推荐
__万波__2 小时前
二十三种设计模式(十三)--模板方法模式
java·设计模式·模板方法模式
程序员卷卷狗4 小时前
Java 单例模式的五种实现:饿汉式、懒汉式、DCL、静态内部类、枚举单例
java·开发语言·单例模式
⑩-5 小时前
Java设计模式-命令模式
java·设计模式·命令模式
AM越.5 小时前
Java设计模式超详解--状态设计模式
java·开发语言·设计模式
FreeCode5 小时前
智能体设计模式解析:ReAct模式
设计模式·langchain·agent
程序员爱钓鱼5 小时前
BlackHole 2ch:macOS无杂音录屏与系统音频采集完整技术指南
前端·后端·设计模式
SmoothSailingT5 小时前
C#——单例模式
开发语言·单例模式·c#
syt_10135 小时前
设计模式之-观察者模式
观察者模式·设计模式
廋到被风吹走17 小时前
【Java】常用设计模式及应用场景详解
java·开发语言·设计模式
Jaycee青橙20 小时前
软件设计模式详解
设计模式