设计模式之单例模式

 

一、单例模式的定义

      单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例

 

二 、单例的实现步骤

  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;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值