单例设计模式是java的一种设计模式,它是指在设计一个类时,要保证在整个程序运行期间针对该类内存中只存在一个实例对象。
单例设计模式包括饿汉式和懒汉式两种模式。
饿汉式:类一加载进内存就创建好了对象;
饿汉式的代码如下:
package com.sjk.sheng; /** * 单例模式之饿汉式 * @author sjk * */ public class Single { //将构造函数私有化,不让别的类建立该类对象 private Single(){} //自己建立一个对象 private static final Single s = new Single(); //提供一个公共访问方式 public static Single getInstance() { return s; } }
懒汉式:类加载进内存的时候,对象还没有存在,只有调用了getInstance()方法时,对象才开始创建。
懒汉式的代码如下:
package com.sjk.sheng; /** * 单例模式之懒汉式 * @author sjk * */ public class Single { private Single(){} private static Single s; public static Single getInstance() { if(s==null) //如果对象为空就创建一个 s=new Single(); return s; } }
懒汉式是延迟加载,如果多个线程同时操作懒汉式时就有可能出现线程安全问题,解决线程安全问题可以加同步来解决。但是加了同步之后,每一次都要比较锁,效率就变慢了,所以可以加双重判断来提高程序效率。
如将上述懒汉式的Instance函数改成同步:
package com.sjk.sheng; /** * 单例模式之懒汉式线程安全问题的解决方案 * * @author sjk * */ public class Single { // 声明本类的一个私有的成员变量 private static Single single; // 第一步 : 私有化构造方法 private Single() { } // 第三步:提供一个公共的方法获取该类的实例对象 public static Single getInstance() { if (single == null) { synchronized (single) { if (single == null) { single = new Single(); } } } return single; } }
以上通过饿汉式和懒汉式实现了单例模式,它具备如下的特点:
1)类的构造方法使用private修饰,声明为私有,这样就不能在类的外部使用new关键字来创建实例对象了。
2)在类的内部创建一个该类的实例对象,并使用静态变量s引用该对象,由于变量应该禁止外界直接访问,因此使用private修饰,声明为私有成员。
3)为了让类的外部能够获得类的实例对象,需要定义一个静态方法getInstance(),用于返回该类的实例s。由于是静态的,外部可以通过“类名.方法名”的方式来访问。
因此饿汉式的单例模式也可以写成以下形式:
package com.sjk.sheng; /** * 单例模式之饿汉式的另一种形式 * @author sjk * */ public class Single { private Single() {} public static final Single s = new Single(); }
在上面代码中,首先将该类的构造方法私有化,防止外界创建该类的实例。在该类的内部创建了该类的实例对象,并使用静态变量s来引用,变量s的前面有三个修饰符,其中,public的作用是允许外部直接访问该变量,static的作用是让外部可以使用“类名.变量名”的方式来访问变量,final的作用是禁止外部对该变量进行修改。由于访问变量s是获得Single类实例对象的唯一途径,因此该类实现了单例。