java设计模式之单例模式

preview
共20个文件
java:20个
需积分: 0 0 下载量 106 浏览量 更新于2018-12-30 收藏 6KB RAR 举报
Java设计模式中的单例模式是一种常用的创建型设计模式,它保证了类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,比如控制共享资源、管理配置信息等。接下来,我们将深入探讨8种不同的单例实现方式。 1. **饿汉式单例(Eager Initialization)** 这是最简单的单例实现,类加载时就完成了初始化。由于在类加载时就已完成实例化,所以线程安全,但可能会造成内存浪费。 ```java public class Singleton { private static final Singleton INSTANCE = new Singleton(); private Singleton() {} public static Singleton getInstance() { return INSTANCE; } } ``` 2. **懒汉式单例(Lazy Initialization)** 类加载时不初始化,首次调用`getInstance()`时才实例化。线程不安全,多个线程可能同时创建单例对象。 ```java public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } ``` 3. **双重检查锁定(Double-Check Locking)** 懒汉式的一种改进,通过加锁确保线程安全,但只有在`instance`为`null`时才进行实例化。 ```java public class Singleton { private volatile static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } } ``` 4. **静态内部类单例(Static Inner Class)** 静态内部类保证了类的延迟加载,同时利用类装载机制保证线程安全。 ```java public class Singleton { private Singleton() {} private static class SingletonInstance { private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return SingletonInstance.INSTANCE; } } ``` 5. **枚举单例(Enum Singleton)** Java枚举天然支持单例,线程安全且防止反射攻击。 ```java public enum Singleton { INSTANCE; public void whateverMethod() {} } ``` 6. **登记式单例(Registry-Based Singleton)** 使用注册表或Map来存储单例对象,这种方式在某些框架如Spring中常见。 ```java public class SingletonRegistry { private static Map<String, Object> registry = new HashMap<>(); public static <T> T getSingleton(String key, Supplier<T> supplier) { return registry.computeIfAbsent(key, supplier); } } public class MySingleton { public static MySingleton getInstance() { return SingletonRegistry.<MySingleton>getSingleton("mySingleton", MySingleton::new); } } ``` 7. **构造器私有化单例(Private Constructor Singleton)** 构造器私有化,外部无法通过`new`关键字实例化,只能通过指定的工厂方法获取单例。 ```java public class Singleton { private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton() {} public static Singleton getInstance() { return SingletonHolder.INSTANCE; } } ``` 8. **线程局部变量单例(ThreadLocal Singleton)** 使用`ThreadLocal`为每个线程提供一个独立的单例实例,适用于多线程环境下的隔离需求。 ```java public class ThreadLocalSingleton { private static ThreadLocal<Singleton> instance = new ThreadLocal<>(); private ThreadLocalSingleton() {} public static Singleton getInstance() { Singleton localInstance = instance.get(); if (localInstance == null) { instance.set(new Singleton()); localInstance = instance.get(); } return localInstance; } } ``` 以上就是8种常见的Java单例模式实现方式,每种方式都有其适用场景和优缺点,开发者应根据实际需求选择合适的设计模式。在实际开发中,理解并熟练运用这些模式,有助于提高代码质量,降低维护成本。