Java设计模式的单例模式实例分析

发布时间:2022-03-29 09:06:29 作者:iii
来源:亿速云 阅读:92

Java设计模式的单例模式实例分析

1. 单例模式简介

单例模式(Singleton Pattern)是一种常用的软件设计模式,属于创建型模式。它确保一个类只有一个实例,并提供一个全局访问点来访问该实例。单例模式通常用于控制资源的访问,例如数据库连接、线程池、日志对象等。

1.1 单例模式的特点

1.2 单例模式的适用场景

2. 单例模式的实现方式

在Java中,单例模式有多种实现方式,每种方式都有其优缺点。下面我们将介绍几种常见的实现方式。

2.1 饿汉式单例模式

饿汉式单例模式在类加载时就创建了单例实例,因此它是线程安全的。

public class EagerSingleton {
    // 在类加载时就创建实例
    private static final EagerSingleton instance = new EagerSingleton();

    // 私有构造函数,防止外部实例化
    private EagerSingleton() {}

    // 提供全局访问点
    public static EagerSingleton getInstance() {
        return instance;
    }
}

优点: - 实现简单,线程安全。

缺点: - 如果单例类从未被使用,会造成资源浪费。

2.2 懒汉式单例模式

懒汉式单例模式在第一次使用时才创建实例,延迟了实例的创建。

public class LazySingleton {
    private static LazySingleton instance;

    // 私有构造函数,防止外部实例化
    private LazySingleton() {}

    // 提供全局访问点
    public static synchronized LazySingleton getInstance() {
        if (instance == null) {
            instance = new LazySingleton();
        }
        return instance;
    }
}

优点: - 延迟了实例的创建,节省了资源。

缺点: - 每次获取实例时都需要同步,性能较差。

2.3 双重检查锁定单例模式

双重检查锁定(Double-Checked Locking)是一种改进的懒汉式单例模式,它通过双重检查来减少同步的开销。

public class DoubleCheckedSingleton {
    private static volatile DoubleCheckedSingleton instance;

    // 私有构造函数,防止外部实例化
    private DoubleCheckedSingleton() {}

    // 提供全局访问点
    public static DoubleCheckedSingleton getInstance() {
        if (instance == null) {
            synchronized (DoubleCheckedSingleton.class) {
                if (instance == null) {
                    instance = new DoubleCheckedSingleton();
                }
            }
        }
        return instance;
    }
}

优点: - 延迟了实例的创建,且只在第一次创建实例时同步,性能较好。

缺点: - 实现较为复杂,需要注意volatile关键字的使用。

2.4 静态内部类单例模式

静态内部类单例模式利用了类加载机制来保证线程安全,同时实现了延迟加载。

public class StaticInnerClassSingleton {
    // 私有构造函数,防止外部实例化
    private StaticInnerClassSingleton() {}

    // 静态内部类
    private static class SingletonHolder {
        private static final StaticInnerClassSingleton INSTANCE = new StaticInnerClassSingleton();
    }

    // 提供全局访问点
    public static StaticInnerClassSingleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

优点: - 线程安全,延迟加载,实现简单。

缺点: - 无法传递参数给单例实例。

2.5 枚举单例模式

枚举单例模式是《Effective Java》作者Joshua Bloch推荐的一种实现方式,它不仅能避免多线程同步问题,还能防止反序列化重新创建新的对象。

public enum EnumSingleton {
    INSTANCE;

    public void doSomething() {
        // 单例类的业务方法
    }
}

优点: - 线程安全,防止反序列化,实现简单。

缺点: - 无法继承其他类。

3. 单例模式的优缺点

3.1 优点

3.2 缺点

4. 总结

单例模式是一种简单但强大的设计模式,适用于需要全局唯一实例的场景。不同的实现方式各有优缺点,开发者应根据具体需求选择合适的实现方式。在实际开发中,应谨慎使用单例模式,避免滥用导致系统复杂性和维护成本的增加。

推荐阅读:
  1. 折腾Java设计模式之单例模式
  2. Java设计模式之单例模式如何实现

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:Android如何调用外置摄像头

下一篇:Netty分布式ByteBuf使用的回收逻辑是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》