【设计模式】单例模式
实现单例模式的四种方式:
1、懒汉模式
懒汉模式,用到时才创建对象。所以存在线程安全隐患,可以在getInstance()方法前加synchroinzed关键字来设置成同步方法,这样就不会有线程安全问题,但是会降低效率。
/** * 懒汉模式 */ class Singleton1 { private static Singleton1 singleton = null; private Singleton1() { } public static Singleton1 getInstance() { if (singleton == null) { singleton = new Singleton1(); } return singleton; } }
2、饿汉模式
饿汉模式,内部创建了一个静态的对象。所以在类加载时就已经创建好了对象,不会出现线程安全问题。但是没有达到Lazy Loading(懒加载)的效果。如果从始至终都没有用到这个实例,则会造成内存资源的浪费。
/** * 饿汉模式 */ class Singleton2 { private static final Singleton2 singleton = new Singleton2(); private Singleton2() { } public static Singleton2 getInstance() { return singleton; } }
3、静态内部类模式
静态内部类模式和饿汉模式类似。但是它解决了饿汉模式不是Lazy Loading的问题。这种模式并不会在Singleton3时立即被实例化,而是在调用getInstance()方法时,才会加载Creator来实例化Singleton3的一个实例。不仅线程安全,还延迟加载,效率高。
/** * 静态内部类模式 */ class Singleton3 { private Singleton3() { } private static class Creator { private static final Singleton3 singleton = new Singleton3(); } public static Singleton3 getInstance() { return Creator.singleton; } }
4、枚举模式
枚举本身特性就是一个单例模式,但是在日常使用中很少用到。
/** * 枚举模式 */ enum Singleton4 { SINGLETON4; public void show() { } }
有梦为马