设计模式详解之单例模式

一、定义

单例模式是创建型的

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

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

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

二、实现

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;
    }
}
相关推荐
WaaTong1 小时前
《重学Java设计模式》之 单例模式
java·单例模式·设计模式
WaaTong3 小时前
《重学Java设计模式》之 原型模式
java·设计模式·原型模式
霁月风3 小时前
设计模式——观察者模式
c++·观察者模式·设计模式
暗黑起源喵6 小时前
设计模式-工厂设计模式
java·开发语言·设计模式
wrx繁星点点13 小时前
状态模式(State Pattern)详解
java·开发语言·ui·设计模式·状态模式
金池尽干15 小时前
设计模式之——观察者模式
观察者模式·设计模式
也无晴也无风雨15 小时前
代码中的设计模式-策略模式
设计模式·bash·策略模式
捕鲸叉1 天前
MVC(Model-View-Controller)模式概述
开发语言·c++·设计模式
wrx繁星点点1 天前
享元模式:高效管理共享对象的设计模式
java·开发语言·spring·设计模式·maven·intellij-idea·享元模式
凉辰1 天前
设计模式 策略模式 场景Vue (技术提升)
vue.js·设计模式·策略模式