Java设计模式之单例模式

本文详细介绍了单例模式的概念、实现要求及五种实现方式:饿汉式、懒汉式、双重检查锁、静态内部类实现及利用枚举,每种方式都提供了相应的代码示例。

一、单例模式

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

二、模式要求

1、自己的构造方法必须私有化

2、类的内部自己创建一个自己唯一的实例

3、要提供一个公开的静态方法供其他对象获取该实例

三、几种实现方式

  • 饿汉式
public class Simple {
	private static Simple simple = new Simple();
	
	private Simple() {
		
	}
	
	public static Simple getInstance() {
		return simple;
	}
}

         这种实现方式在类加载时进行实例化,没有延迟加载,是线程安全的。   

  • 懒汉式
public class Slacker {

	private static volatile Slacker slacker = null;
	
	private Slacker() {
		
	}
	
	/**
	 * 最简单的懒汉式实现
	 * @return
	 */
	public static Slacker getInstance() {
		if(slacker == null) {
			slacker = new Slacker();
		}
		return slacker;
	}

}

  这种实现方式是最基本的实现,最大的问题是不支持多线程,并发访问方法会获得不止一个实例,所以严格来讲不是单例模式。

public class Slacker {
        //volatile关键字的作用
	//1、保证内存可见性:保证每个线程访问volatile修饰的共享变量时获取到的都是最新的。
	//2、防止指令重排序--通过内存屏障实现
	private static volatile Slacker slacker = null;
	
	private Slacker() {
		
	}

        /**
	 * 加synchronized关键字解决线程同步问题
	 * @return
	 */
	public static synchronized Slacker getInstanceSync() {
		if(slacker == null) {
			slacker = new Slacker();
		}
		return slacker;
	}

}

         这种通过在方法上加synchronized锁实现的方式,可以解决线程并发访问的问题,实现单例,但是加锁后会影响效率,所以往往不这样使用。

  • 双重检查锁
public class Slacker {
	//volatile关键字的作用
	//1、保证内存可见性:保证每个线程访问volatile修饰的共享变量时获取到的都是最新的。
	//2、防止指令重排序--通过内存屏障实现
	private static volatile Slacker slacker = null;
	
	private Slacker() {
		
	}

        /**
	 * 双重检查锁解决线程同步问题
	 * @return
	 */
	public static Slacker getInstanceDoubleLock() {
		if(slacker == null) {
			synchronized (Slacker.class) {
				if(slacker == null) {
					slacker = new Slacker();
				}
			}
		}
		return slacker;
	}
	

}

         这种方式采用双锁机制,能够适应多线程并发访问的情况,且能保持高性能。

  • 静态内部类实现
/**
 * 静态内部类方式实现单例模式
 * 
 * 当StaticInnerClass第一次被加载时,并不需要去加载StaticInnerClassHoler,只有当getInstance()方法第一次被调用时,
 * 才会去初始化staticInnerClass,第一次调用getInstance()方法会导致虚拟机加载StaticInnerClassHoler类,这种方法不仅能
 * 确保线程安全,也能保证单例的唯一性,同时也延迟了单例的实例化。
 * 
 * @author chenf
 *
 */
public class StaticInnerClass {
	private StaticInnerClass() {

	}

	// 静态内部类
	private static class StaticInnerClassHoler {
		// 在静态内部类中定义外部类的实例
		private static StaticInnerClass staticInnerClass = new StaticInnerClass();
	}

	/**
	 * 获取时调用静态内部类的类属性获取外部类的实例
	 * 
	 * @return
	 */
	public static StaticInnerClass getInstance() {
		return StaticInnerClassHoler.staticInnerClass;
	}
}

       这种方式不仅可以实现多线程的安全访问,同时还可以使用内部类加载机制达到延迟加载的目的。

  • 利用枚举
内容概要:本文档介绍了基于3D FDTD(时域有限差分)方法在MATLAB平台上对微带线馈电的矩形天线进行仿真分析的技术方案,重点在于模拟超MATLAB基于3D FDTD的微带线馈矩形天线分析[用于模拟超宽带脉冲通过线馈矩形天线的传播,以计算微带结构的回波损耗参数]宽带脉冲信号通过天线结构的传播过程,并计算微带结构的回波损耗参数(S11),以评估天线的匹配性能和辐射特性。该方法通过建立三维电磁场模型,精确求解麦克斯韦方程组,适用于高频电磁仿真,能够有效分析天线在宽频带内的响应特性。文档还提及该资源属于一个涵盖多个科研方向的综合性MATLAB仿真资源包,涉及通信、信号处理、电力系统、机器学习等多个领域。; 适合人群:具备电磁场与微波技术基础知识,熟悉MATLAB编程及数值仿真的高校研究生、科研人员及通信工程领域技术人员。; 使用场景及目标:① 掌握3D FDTD方法在天线仿真中的具体实现流程;② 分析微带天线的回波损耗特性,优化天线设计参数以提升宽带匹配性能;③ 学习复杂电磁问题的数值建模与仿真技巧,拓展在射频与无线通信领域的研究能力。; 阅读建议:建议读者结合电磁理论基础,仔细理解FDTD算法的离散化过程和边界条件设置,运行并调试提供的MATLAB代码,通过调整天线几何尺寸和材料参数观察回波损耗曲线的变化,从而深入掌握仿真原理与工程应用方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值