单例设计模式是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类实例对象的唯一途径,因此该类实现了单例。
来源:https://www.cnblogs.com/sheng-sjk/p/7622975.html