一、单例模式的定义
单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例
二 、单例的实现步骤
1)构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。
2)在该类内部产生一个唯一的实例化对象,并且将其封装为private static类型。
3)定义一个静态方法返回这个唯一对象
三、单例的实现方式
常见的单例实现有饿汉式和饱汉式两种写法。
3.1 饿汉式写法
a) 常规写法
package com.shanxian.hungry;
/**
* 饿汉式单例
* @author shanxian
*
*/
public class HungrySingleton01 {
//直接new一个实例 并用static 修饰
private static HungrySingleton01 hungry = new HungrySingleton01();
// 构造方法私有化
private HungrySingleton01() {
}
// 提供一个静态的返回实例的方法
public static HungrySingleton01 getHungrySingleton() {
return hungry;
}
}
b)静态代码快
package com.shanxian.hungry;
/**
* 饿汉式单例--静态代码快
* @author shanxian
*
*/
public class HungrySingleton02 {
private static HungrySingleton02 hungry = null;
// 使用静态代码块修饰
static {
hungry = new HungrySingleton02();
}
// 构造方法私有化
private HungrySingleton02() {
}
// 提供一个静态的返回实例的方法
public static HungrySingleton02 getHungrySingleton() {
return hungry;
}
}
3.2 饱汉式写法
a)常规写法
package com.shanxian.satiate;
/**
* 饱汉式单例
* @author shanxian
*
*/
public class SatiateSingleton01 {
private static SatiateSingleton01 satiate = null;
// 构造方法私有化
private SatiateSingleton01() {
}
// 提供一个静态的返回实例的方法
public static SatiateSingleton01 getSatiateSingleton() {
satiate =new SatiateSingleton01();
return satiate;
}
}
b)once check 判断为空时实例化
package com.shanxian.satiate;
/**
* 饱汉式单例---判断为空时实例化
* @author shanxian
*
*/
public class SatiateSingleton02 {
private static SatiateSingleton02 satiate = null;
// 构造方法私有化
private SatiateSingleton02() {
}
// 提供一个静态的返回实例的方法
public static SatiateSingleton02 getSatiateSingleton() {
if(satiate == null) {
satiate =new SatiateSingleton02();
}
return satiate;
}
}
c) 同步方法+once check
package com.shanxian.satiate;
/**
* 饱汉式单例---同步方法+判断为空时实例化
* @author shanxian
*
*/
public class SatiateSingleton03 {
private static SatiateSingleton03 satiate = null;
// 构造方法私有化
private SatiateSingleton03() {
}
// 提供一个静态的返回实例的方法
public static synchronized SatiateSingleton03 getSatiateSingleton() {
if(satiate == null) {
satiate =new SatiateSingleton03();
}
return satiate;
}
}
d) 同步代码块+once check
package com.shanxian.satiate;
/**
* 饱汉式单例---同步代码块+判断为空时实例化
* @author shanxian
*
*/
public class SatiateSingleton04 {
private static SatiateSingleton04 satiate = null;
// 构造方法私有化
private SatiateSingleton04() {
}
// 提供一个静态的返回实例的方法
public static SatiateSingleton04 getSatiateSingleton() {
if(satiate == null) {
synchronized (SatiateSingleton04.class) {
satiate =new SatiateSingleton04();
}
}
return satiate;
}
}
e)同步代码块+double check
/**
* 饱汉式单例---同步代码块+双重检查double check
* @author shanxian
*
*/
public class SatiateSingleton05 {
private static SatiateSingleton05 satiate = null;
// 构造方法私有化
private SatiateSingleton05() {
}
// 提供一个静态的返回实例的方法
public static SatiateSingleton05 getSatiateSingleton() {
if(satiate == null) {
synchronized (SatiateSingleton05.class) {
if(satiate == null) {
satiate =new SatiateSingleton05();
}
}
}
return satiate;
}
}
f) 静态内部类
/**
* 饱汉式单例---静态内部类
* @author shanxian
*
*/
public class SatiateSingleton06 {
// 构造方法私有化
private SatiateSingleton06() {
}
//静态内部类
private static class SatiateSingletonHolder{
private static final SatiateSingleton06 satiate=new SatiateSingleton06();
}
public static SatiateSingleton06 getSatiateSingleton() {
return SatiateSingletonHolder.satiate;
}
}