设计模式之单例模式
概念定义
1 2 3 4 5 6 7
| 定义:单例模式是指某一个类运行过程中只有一个实例产生,且由这个类自己产生,然后对外提供一个可以访问他的全局访问方法。 作用:提供唯一一个实例,避免资源的抢夺。常见于以下的场景中: * 资源共享:单例模式可以用于管理共享的系统资源,例如数据库连接池、线程池或缓存。通过使用单例模式,可以确保只有一个实例存在,从而避免资源竞争和浪费。 * 配置信息:当你需要在应用程序中保存全局配置信息时,可以使用单例模式。单例对象可以加载配置文件或从数据库中读取配置信息,并在应用程序的其他部分提供访问。 * 日志记录器:在日志记录器中使用单例模式可以确保在整个应用程序中只有一个日志记录器实例。这样可以避免创建多个日志记录器对象,并统一管理日志的写入和输出。 * 对象缓存:单例模式可以用于实现对象的缓存。当你需要频繁创建和销毁对象,并希望在创建对象时重用已有对象时,可以使用单例模式来实现对象的缓存功能。
|
实现方式之概述
单例模式有很多种的实现方式,这里仅介绍:饿汉式、懒汉式、双重检查锁单例模式、枚举单例模式。详情如下:
饿汉式:实例创建时机在类加载过程之中。当一个人很饥饿的时候,立马就想吃到东西,所以在加载过程中就进行创建实例了。
懒汉式:实例创建时机在类加载过程之后(这个实例需要被用到的时候才去创建对应的实例)。当一个人很懒惰的时候,只有到了必须的时候才会进行相应的活动,所以在被引用的时候才会去创建实例。
双重检查锁单例模式: 双重检查锁单例模式通过使用双重检查锁机制来实现懒加载和线程安全。在这种模式中,首先检查实例是否已经被创建,如果尚未创建,则使用同步块的方式创建实例。然后再次检查实例是否已经被创建,以防止多个线程同时创建实例。该方式避免了对整个方法进行同步,提高了性能,具有**==延迟加载==和==线程安全==**的特性。
枚举单例模式:
线程安全:枚举单例模式在Java中天然地是线程安全的。枚举实例的创建由JVM保证,在任何情况下都只会创建一个实例,不需要担心线程安全问题。
防止反序列化创建新实例:枚举单例模式默认情况下防止了通过反序列化创建新的实例。因为枚举类的实例是有限且预定义的,所以不会发生创建新实例的情况。
简洁明了:枚举单例模式的实现非常简洁,代码量很少。而且枚举类提供了序列化、线程安全和保证单例的功能,无需开发人员手动编写这些逻辑。
实现方式之代码
- 饿汉式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| package com.jw.cloud.modulepattern.singleton;
public class Singleton1 {
private static final Singleton1 instance = new Singleton1(); private Singleton1() {}
public static Singleton1 getInstance() { return instance; } }
|
- 懒汉式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| package com.jw.cloud.modulepattern.singleton;
public class Singleton2 {
private Singleton2() {}
private static Singleton2 single = null;
public static Singleton2 getInstance() { if (single == null) { single = new Singleton2(); } return single; }
public static synchronized Singleton2 getInstance1() { if (single == null) { single = new Singleton2(); } return single; } }
|
- 双重检查锁单例模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| package com.jw.cloud.modulepattern.singleton;
public class Singleton4 { private static volatile Singleton4 singletonMode;
private Singleton4() { }
public static Singleton4 getInstance() { if (singletonMode == null) { synchronized (Singleton4.class) { if (singletonMode == null) { singletonMode = new Singleton4(); } } } return singletonMode; } }
|
- 枚举单例模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| package com.jw.cloud.modulepattern.singleton;
public enum Singleton5 {
INSTANCE;
public static Singleton5 getInstance() { return INSTANCE; } }
|