单例模式顾名思义,一个类只允许有一个实例,因而只能创建一次,之后访问返回的都是第一次创建的实例。因为不能随意创建,单例类的构造方法都是私有的,只能通过静态方法来获取实例。
单例模式分为饿汉模式和懒汉模式,区别在于创建实例的时机不同:饿汉模式在类初始化的时候创建;懒汉模式在调用获取实例方法时创建。
1. 懒汉模式(Lazy)
public class LazySingleton { private static LazySingleton singleton; private LazySingleton() { } public static LazySingleton getInstance() { if (singleton == null) { singleton = new LazySingleton(); } return singleton; } }
采用懒加载的方式:在需要的时候再创建实例,但上面的实现不是线程安全的,需要采用二重检查来保证线程安全。
public class LazySingleton { private static LazySingleton singleton; private LazySingleton() { } public static LazySingleton getInstance() { if (singleton == null) { synchronized (LazySingleton.class) { if (singleton == null) { singleton = new LazySingleton(); } } } return singleton; } }
2. 饿汉模式
public class HungrySingleton { private static HungrySingleton singleton = new HungrySingleton(); private HungrySingleton() { } public static HungrySingleton getInstance() { return singleton; } }
在类初始化的时候创建实例,之后获取到的实例都是第一次所创建的,天然线程安全。缺点在于,无论你是否需要创建实例,都会在类初始化的时候创建。
3. 匿名内部类实现
在内部类初始化的时候创建实例,与饿汉模式的区别在于可以控制内部类初始化的时机:只有在调用getInstance方法时才会初始化内部类,以达到懒加载的效果。同样,因为是类初始化的时候创建,天然的线程安全。public class InnerClassSingleton { private InnerClassSingleton() { } private static class InnerClass { public static InnerClassSingleton singleton = new InnerClassSingleton(); } public static InnerClassSingleton getInstance() { return InnerClass.singleton; } }
设计模式之单例模式
最新推荐文章于 2023-02-08 15:44:02 发布