单例设计模式
所谓的设计模式指的就是:遇到同一种情况的,采取的一种成熟的处理的方法--->设计模式。
本次列举的是单例模式,那么什么是单例模式哪?“单例”也就是单实例,所以要解决的问题就是在内部控制对象的产生,从而保证对象的唯一性,
其中枚举就是一个单例:
/** * 最简单的单例模式代码 * @author D H B * */ public enum SingleEnum { MONDAY; }
1.单例模式:懒汉式和饿汉式
a:饿汉式
它指的是不管你有没有使用这个对象,这个对象都会被创建,都会把这个对象加载进内存。
代码如下:
/** * 单例设计模式中的懒汉式 * * @author dhb * */ public class Hungry { // 方式一: private static final Hungry instance = new Hungry(); // 构造方法私有化,保证对象的唯一性: private Hungry() { } // 对外提供公共的获取对象的方法: public static Hungry getInstance() { return instance; } }
/** * 方式二: * * @author dhb * */ public class Singleton { //创建实例的对象: public static final Singleton instance = new Singleton(); //构造器私有 private Singleton() { } }
b:懒汉式
就是说需要的时候,就创建对象,不需要的时候,就不创建。
/** * 懒汉式: * 就是有需要 的时候,再去创建对象,不需要的时候,就不在创建 * @author dhb * */ public class LazySingleton { private static final LazySingleton instance = null; //构造器私有化 private LazySingleton() {} /** * 对外提供公共的获取对象的方法 * 说明:此时存在线程的<安全隐患:> * @return> */ public static LazySingleton getInstance() { if(null == instance) { return new LazySingleton(); } return null; }
说明:上述的懒汉式存在安全隐患,所以解决如下:
/** * 懒汉式:增强安全 、提升性能 */ public class LazySingletonPlus { private static LazySingletonPlus INSTANCE = null; // 构造器私有化 private LazySingletonPlus() { } // 提供公共的获取对象的方法。 public static LazySingletonPlus getInstance() { if (null == INSTANCE) {//提升效率:如果内存中已经存在这个对象了,那么就不在进"锁 "中判断了。 synchronized (LazySingletonPlus.class) {//解决线程安全隐患问题:(在静态的方法中不能使用this关键字) if(null == INSTANCE) { INSTANCE = new LazySingletonPlus(); return INSTANCE; } } } return null; } }