一、创建型(单例模式)

单例模式

概念
单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。它控制类的实例化过程,防止外部代码创建新的实例。


应用场景

  1. 日志记录:确保只有一个日志记录器,以便于管理和避免重复记录。
  2. 配置管理:用于读取和存储配置信息,确保全局只有一个配置对象。
  3. 线程池:管理线程池,确保其只有一个实例,便于资源管理。
  4. 数据库连接:通过单例模式管理数据库连接,避免频繁创建和销毁连接。
  5. 缓存管理:使用单例管理缓存,以确保数据一致性和减少内存使用。
  6. UI管理:在图形用户界面中,某些组件如主窗口可能需要确保只有一个实例。

注意点

  • 线程安全:如果在多线程环境中使用,需要确保线程安全,避免出现多个实例。
  • 序列化问题:反序列化时,可能会创建新的实例,需实现 readResolve 方法防止此问题。
  • 懒加载:如果实例的创建开销较大,可以使用懒加载方式,但需处理好同步问题。

核心要素

  1. 私有构造函数:防止外部实例化。
  2. 静态变量:持有唯一实例。
  3. 静态方法:提供访问实例的全局方法。
  4. 线程安全:确保在多线程环境下安全使用。

Java代码示例

public class Singleton {
    // 懒汉式:延迟加载,线程安全
    private static volatile Singleton instance;

    private Singleton() {
        // 私有构造函数
    }

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

各种变形用法

  1. 饿汉式
    在类加载时就创建实例,适合实例化开销不大且始终需要使用的场景。

    public class EagerSingleton {
        private static final EagerSingleton instance = new EagerSingleton();
    
        private EagerSingleton() {}
    
        public static EagerSingleton getInstance() {
            return instance;
        }
    }
    
  2. 静态内部类
    利用静态内部类实现懒加载,同时线程安全。

    public class StaticInnerClassSingleton {
        private StaticInnerClassSingleton() {}
    
        private static class Holder {
            private static final StaticInnerClassSingleton INSTANCE = new StaticInnerClassSingleton();
        }
    
        public static StaticInnerClassSingleton getInstance() {
            return Holder.INSTANCE;
        }
    }
    
  3. 枚举方式
    Java中推荐的单例实现方式,天然支持序列化。

    public enum EnumSingleton {
        INSTANCE;
        // 其他方法
    }
    
  4. 双重检查锁定
    提高性能,减少同步开销。

    public class DoubleCheckedLockingSingleton {
        private static volatile DoubleCheckedLockingSingleton instance;
    
        private DoubleCheckedLockingSingleton() {}
    
        public static DoubleCheckedLockingSingleton getInstance() {
            if (instance == null) {
                synchronized (DoubleCheckedLockingSingleton.class) {
                    if (instance == null) {
                        instance = new DoubleCheckedLockingSingleton();
                    }
                }
            }
            return instance;
        }
    }
    

这些是单例模式的基本知识和变形用法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伯牙碎琴

努力耕耘分享交流,感谢您的赏识

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值